テーブル・行・列の基本

テーブル・行・列の基本 とは

テーブル・行・列の操作を通して、データベースの構造を理解します。本レッスンでは、テーブル・行・列の基本 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

リレーショナルデータベースを扱うときに最初に押さえるべき構造が「テーブル」「行」「列」の 3 要素です。SQL の構文はすべてこの 3 つを操作する操作 (取り出す・追加する・更新する・削除する) の組み合わせなので、ここで用語が曖昧なままだと、あとで結合や集計の話に進んだときに毎回つまずきます。

さらに列ごとに型 (data type) と制約 (constraint) を決める という考え方は、データの品質を守る最強の盾でもあります。本レッスンでは図と例で「テーブル・行・列」の感覚を磨き、データ型と制約の役割まで掴みます。

三層構造のイメージ

テーブルは紙の表と同じで、横方向に列、縦方向に行が並びます。それぞれの専門用語は次の通りです。

  • テーブル は、関心対象 (社員、商品、注文など) を表すデータの集まり
  • 行 (row) は、その対象の 1 件のインスタンス。1 人の社員、1 件の注文を表す
  • 列 (column) は、各行に共通する属性。社員なら id, name, email, hired_on といった項目
diagram (will load when visible)

図の通り、テーブルは行の集合、行は列に値を持ったオブジェクト、と階層を意識しておくと、SQL の SELECT が「特定の行と特定の列を切り出す操作」だとはっきり見えてきます。

列にはデータ型がある

テーブル定義 (CREATE TABLE) では、各列に必ず データ型 を指定します。型は「この列にどんな値が入るか」を DBMS に伝えるルールで、不適切な値の混入を防ぎます。

SQL クエリ

CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100), salary DECIMAL(10,2) NOT NULL, hired_on DATE NOT NULL, is_active BOOLEAN NOT NULL DEFAULT TRUE );

代表的な型は次の通りです。

  • 整数型INTBIGINTSMALLINT など
  • 小数型DECIMAL(p,s) (金額に最適、誤差なし) や DOUBLE (科学計算向け)
  • 文字列型VARCHAR(n) (可変長) や CHAR(n) (固定長)、TEXT (長文)
  • 日付・時刻型DATETIMESTAMPTIMESTAMP
  • 真偽値型BOOLEAN (DBMS によっては BOOLEAN で代替)

金額の保存に FLOATDOUBLE を使うのは厳禁です。浮動小数点の丸め誤差で 1 円ずれます。金額は必ず DECIMAL(10,2) のような固定小数点型を使うのがプロの常識です。

列に付けられる制約

型に加えて、列ごとに 制約 (constraint) を付けてデータの品質を守ります。

プレーンテキスト

NOT NULL -- 必ず値が入ることを強制 UNIQUE -- 重複した値を禁止 DEFAULT x -- INSERT で省略されたら x を入れる CHECK (...) -- 値の範囲を制限 (年齢 >= 0 など) PRIMARY KEY -- 主キー (NOT NULL かつ UNIQUE) FOREIGN KEY -- 他テーブルとの参照整合性

たとえば「emailは重複禁止、年齢は 0 以上」を CREATE TABLE で表現すると、アプリ側の不具合があっても DBMS が最後の防壁になってくれます。

制約はコードコメントではなく「DBMS に強制してもらう契約」です。アプリのバグでも、別のスクリプトが直接書き込んでも、制約に違反する INSERT は拒否されます。

行は ID で識別する

行を一意に識別するために 主キー (PRIMARY KEY) を 1 列または複数列に張ります。慣習的に id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY という形で、連番の整数を使うことが多いです。これにより「同じ田中さんが 2 人いても」「メールアドレスを変更しても」、行を確実に区別できます。主キーは次のレッスンで詳しく扱います。

SELECT で行と列を切り出す

テーブルの定義側 (CREATE TABLE) を理解したら、参照側 (SELECT) の発想は単純です。

SQL クエリ

-- 列をしぼる (縦切り) SELECT name, salary FROM employees; -- 行をしぼる (横切り) SELECT * FROM employees WHERE department = '開発'; -- 列も行も両方しぼる SELECT name, salary FROM employees WHERE salary >= 5000000;

たったこれだけのパターンを組み合わせるだけで、SELECT 文の大半が表現できます。後の章で扱う集約・結合・サブクエリも、すべてこの「切り出す」発想の延長線上にあります。

演習でやること

演習エディタには employees テーブルが用意されています。テーブルから「列を絞って・行を絞って」結果を取り出す感覚をつかみましょう。

まとめ

  • テーブルは行の集合、行は列の集合という階層構造
  • 列には必ずデータ型を指定する
  • 金額は DECIMAL、文字列は VARCHAR、日付は DATE が基本
  • 制約 (NOT NULL / UNIQUE / CHECK 等) でデータ品質を守る
  • 行を識別するための主キーが各テーブルに必要

次のレッスン

次は 主キーとNULL制約 です。主キーとNULL制約について、SQLでの設定方法を実践的に学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. テーブル・行・列 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. テーブル・行・列 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(30) NOT NULL, salary INT NOT NULL, hired_on DATE NOT NULL ); INSERT INTO employees (id, name, department, salary, hired_on) VALUES (1, '田中', '営業', 4200000, '2020-04-01'), (2, '鈴木', '開発', 5500000, '2018-10-15'), (3, '佐藤', '開発', 6300000, '2015-07-20'), (4, '高橋', '人事', 4800000, '2021-01-10'), (5, '山本', '営業', 5100000, '2019-03-05');

期待される出力

idnamedepartment
1田中営業
2鈴木開発
3佐藤開発
4高橋人事
5山本営業

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...