SQL
50 年以上現役の標準クエリ言語。SELECT / INSERT / UPDATE / DELETE から Window 関数 / CTE / JSON / 全文検索まで、Postgres を中心に詳細に。
SQL の概要
- 宣言的: 「何が欲しいか」を書く(手順は DB が考える)
- 標準は ANSI / ISO で定義(SQL:2023 が最新)
- 実装ごとに方言(Postgres / MySQL / SQLite / SQL Server / Oracle)
- 大文字小文字はキーワードのみ区別なし、慣習で大文字
4 つのカテゴリ
| 分類 | 用途 | 例 |
|---|---|---|
| DDL | 定義 | CREATE / ALTER / DROP / TRUNCATE |
| DML | 操作 | SELECT / INSERT / UPDATE / DELETE |
| DCL | 権限 | GRANT / REVOKE |
| TCL | トランザクション | BEGIN / COMMIT / ROLLBACK / SAVEPOINT |
SELECT の論理的実行順序
書く順と実際の評価順は違う。これを知ると挙動が腹落ちする:
書く順:
SELECT → 5
FROM → 1
WHERE → 2
GROUP BY → 3
HAVING → 4
ORDER BY → 6
LIMIT → 7
実際:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
「WHERE で集計関数が使えない」「SELECT のエイリアスが WHERE で使えない」のはこのため。
このセクションの読み方
- DDL — テーブル定義 / ALTER / DROP
- SELECT 詳細 — WHERE / ORDER / LIMIT / DISTINCT
- JOIN — INNER / LEFT / RIGHT / FULL / CROSS / SELF
- 集計と GROUP BY — COUNT / SUM / AVG / HAVING
- Window 関数 — RANK / ROW_NUMBER / 累積
- CTE / サブクエリ — WITH / 再帰 / EXISTS
- UPSERT / JSON / 全文検索 — 現代 SQL の便利機能
- 運用と注意点
方言の違い(よく出るところ)
| 機能 | Postgres | MySQL | SQLite | SQL Server |
|---|---|---|---|---|
| 連番 | SERIAL / IDENTITY | AUTO_INCREMENT | INTEGER PRIMARY KEY | IDENTITY |
| UPSERT | ON CONFLICT | ON DUPLICATE KEY UPDATE | ON CONFLICT | MERGE |
| LIMIT | LIMIT N | LIMIT N | LIMIT N | TOP N / OFFSET FETCH |
| 連結 | || | CONCAT | || | + |
| 大小無視 | ILIKE / citext | LIKE(既定) | NOCASE | COLLATE |
| JSON | JSONB(強) | JSON | JSON 関数 | JSON |
関連セクション
実行環境のおすすめ
- SQLite — 学習に最適。
sqlite3 test.dbで完結 - DBeaver / TablePlus / pgAdmin — GUI
- Supabase Studio / Neon Console — Web で試せる
- DuckDB — CSV / Parquet を直接 SQL
- SQL Fiddle / db-fiddle.com — オンライン実行
サンプルテーブル
本セクションでは以下の 3 テーブルをよく使う:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
body TEXT,
views INT NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'draft',
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
user_id BIGINT NOT NULL REFERENCES users(id),
body TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
学ぶ順番
SELECT → JOIN → GROUP BY → CTE → Window 関数、の順で進めると一気に書けるようになる。 Window 関数を理解した瞬間「SQL ってここまでできるのか」と世界が変わる。