SQL

50 年以上現役の標準クエリ言語。SELECT / INSERT / UPDATE / DELETE から Window 関数 / CTE / JSON / 全文検索まで、Postgres を中心に詳細に。

SQL の概要

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 で使えない」のはこのため。

このセクションの読み方

  1. DDL — テーブル定義 / ALTER / DROP
  2. SELECT 詳細 — WHERE / ORDER / LIMIT / DISTINCT
  3. JOIN — INNER / LEFT / RIGHT / FULL / CROSS / SELF
  4. 集計と GROUP BY — COUNT / SUM / AVG / HAVING
  5. Window 関数 — RANK / ROW_NUMBER / 累積
  6. CTE / サブクエリ — WITH / 再帰 / EXISTS
  7. UPSERT / JSON / 全文検索 — 現代 SQL の便利機能
  8. 運用と注意点

方言の違い(よく出るところ)

機能PostgresMySQLSQLiteSQL Server
連番SERIAL / IDENTITYAUTO_INCREMENTINTEGER PRIMARY KEYIDENTITY
UPSERTON CONFLICTON DUPLICATE KEY UPDATEON CONFLICTMERGE
LIMITLIMIT NLIMIT NLIMIT NTOP N / OFFSET FETCH
連結||CONCAT||+
大小無視ILIKE / citextLIKE(既定)NOCASECOLLATE
JSONJSONB(強)JSONJSON 関数JSON

関連セクション

実行環境のおすすめ

サンプルテーブル

本セクションでは以下の 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 ってここまでできるのか」と世界が変わる。