SQLを理解するには、まずデータベースを「表」として見る感覚が必要です。リレーショナルデータベースでは、多くのデータをテーブル、行、列に分けて管理します。
一言でいうと
リレーショナルデータベースは、データを表に分け、主キーと外部キーで表同士の関係を表します。
登場人物
| 用語 | 意味 |
|---|---|
| テーブル | 同じ種類のデータを入れる表 |
| 行 | 1件分のデータ |
| 列 | データの項目 |
| 主キー | 行を一意に識別する値 |
| 外部キー | 別テーブルの行を参照する値 |
たとえば、ユーザーを管理する users テーブルは次のように考えます。
| id | name | |
|---|---|---|
| 1 | Sato | sato@example.com |
| 2 | Suzuki | suzuki@example.com |
この表では、1行が1人のユーザーです。id、name、email が列です。
テーブルとは
テーブルは、同じ種類のデータをまとめる場所です。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
);
このSQLは、ユーザー用のテーブルを作ります。
| 列 | 役割 |
|---|---|
id | ユーザーを識別する番号 |
name | 表示名 |
email | メールアドレス |
テーブルは「何でも入れる箱」ではなく、同じ種類のデータだけを入れる表です。
行とは
行は、テーブルの中に入る1件分のデータです。
INSERT INTO users (id, name, email)
VALUES (1, 'Sato', 'sato@example.com');
このSQLで、users テーブルに1人分のユーザー情報が入ります。
列とは
列は、各行が持つ項目です。列には、文字列、数値、日時、真偽値などの型を決めます。
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
done BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMP NOT NULL
);
列の設計は、後からSQLの書きやすさに大きく影響します。たとえば、done を文字列の "yes" / "no" で持つより、BOOLEAN で持つ方が条件検索しやすくなります。
主キーとは
主キーは、テーブル内の1行を一意に識別する値です。
SELECT *
FROM users
WHERE id = 1;
id = 1 と指定すれば、特定のユーザー1人を見つけられます。
主キーには、次の性質があります。
| 性質 | 説明 |
|---|---|
| 一意 | 同じ値が重複しない |
| NULL不可 | 空の値にしない |
| 参照しやすい | 他のテーブルから指定できる |
外部キーとは
外部キーは、別のテーブルの主キーを参照する列です。たとえば、注文をユーザーに結びつけるには、orders テーブルに user_id を持たせます。
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
total INTEGER NOT NULL
);
この user_id によって、「この注文はどのユーザーのものか」を表せます。
複数テーブルの関係は、主キーと外部キーを使って表します。
よくある誤解
| 誤解 | 実際 |
|---|---|
| 1つの大きな表に全部入れればよい | 重複や不整合が起きやすくなります |
id はなくてもよい | 行を特定しにくくなります |
| 外部キーはJOINのためだけにある | データの整合性を守る役割もあります |
| 列名は適当でよい | SQLの読みやすさに直結します |
まとめ
リレーショナルデータベースは、テーブル、行、列でデータを整理します。主キーは1行を識別する値で、外部キーは別テーブルとの関係を表します。SQLを学ぶ前に、この表の見方を押さえると、SELECTやJOINが理解しやすくなります。