テーブル・行・列の基本
テーブル・行・列の基本 とは
テーブル・行・列の操作を通して、データベースの構造を理解します。本レッスンでは、テーブル・行・列の基本 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
リレーショナルデータベースを扱うときに最初に押さえるべき構造が「テーブル」「行」「列」の 3 要素です。SQL の構文はすべてこの 3 つを操作する操作 (取り出す・追加する・更新する・削除する) の組み合わせなので、ここで用語が曖昧なままだと、あとで結合や集計の話に進んだときに毎回つまずきます。
さらに列ごとに型 (data type) と制約 (constraint) を決める という考え方は、データの品質を守る最強の盾でもあります。本レッスンでは図と例で「テーブル・行・列」の感覚を磨き、データ型と制約の役割まで掴みます。
三層構造のイメージ
テーブルは紙の表と同じで、横方向に列、縦方向に行が並びます。それぞれの専門用語は次の通りです。
- テーブル は、関心対象 (社員、商品、注文など) を表すデータの集まり
- 行 (row) は、その対象の 1 件のインスタンス。1 人の社員、1 件の注文を表す
- 列 (column) は、各行に共通する属性。社員なら id, name, email, hired_on といった項目
図の通り、テーブルは行の集合、行は列に値を持ったオブジェクト、と階層を意識しておくと、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
);代表的な型は次の通りです。
- 整数型 は
INT、BIGINT、SMALLINTなど - 小数型 は
DECIMAL(p,s)(金額に最適、誤差なし) やDOUBLE(科学計算向け) - 文字列型 は
VARCHAR(n)(可変長) やCHAR(n)(固定長)、TEXT(長文) - 日付・時刻型 は
DATE、TIMESTAMP、TIMESTAMP - 真偽値型 は
BOOLEAN(DBMS によってはBOOLEANで代替)
金額の保存に
FLOATやDOUBLEを使うのは厳禁です。浮動小数点の丸め誤差で 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 つができることを確認しましょう。
- テーブル・行・列 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (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');期待される出力
| id | name | department |
|---|---|---|
| 1 | 田中 | 営業 |
| 2 | 鈴木 | 開発 |
| 3 | 佐藤 | 開発 |
| 4 | 高橋 | 人事 |
| 5 | 山本 | 営業 |