SQL 実習 — テーブル作成からデータ挿入・照会まで
SQL 実習 — テーブル作成からデータ挿入・照会まで
🎯 このレッスンを読み終えたら
このレッスンを最後まで読めば、以下の3つを自信を持ってできるようになります。
- ▸✅ CREATE TABLE + FK + 制約で 実際のスキーマ を設計する
- ▸✅ INSERT · UPDATE · DELETE の WHERE 抜け漏れの落とし穴を理解する
- ▸✅ サブクエリの IN vs EXISTS + GROUP BY + HAVING の組み合わせを使いこなす
学習目標を チェックリストとして手元に置き、すべてに答えられるようになったらレッスンを閉じてください。
テーブルの作成 — CREATE TABLE + 制約
DDL の出発点
制約の5種類
- ▸PRIMARY KEY — 一意 + NOT NULL。行の識別子。テーブルに1つだけ。
- ▸NOT NULL — 空にできない。
- ▸UNIQUE — 重複不可。PK と違い、複数設定できる。
- ▸CHECK — 値の範囲を検証。
CHECK (age >= 0)。 - ▸FOREIGN KEY — 他のテーブルを参照。参照整合性を保証する。
外部キー — リレーションの作成
ON DELETE CASCADE — 親行を削除すると 子行も自動的に削除される。RESTRICT(デフォルト)の場合、子が存在すると親の削除が拒否される。
INSERT · UPDATE · DELETE
WHERE のない UPDATE/DELETE は全行が対象。誤って1行省略すると テーブルごと消える。必ずトランザクション内でテストしましょう。
JOIN — INNER と LEFT の違い
テストデータ
INNER JOIN — 両方に存在する行のみ
LEFT JOIN — 左テーブルの行はすべて含まれる
B のように 対応する行がないユーザーも NULL として含まれる。「注文のないユーザーを探す」 場面でよく使う:
RIGHT JOIN — ほとんど使わない
テーブルの順序を入れ替えれば LEFT JOIN で表現できる。統一性のために LEFT だけ 使うチームが多い。
CROSS JOIN — すべての組み合わせ
直積(デカルト積)。実務ではほぼ使わない — 誤って ON を省略すると発生する 大惨事。
サブクエリ · GROUP BY · HAVING
サブクエリの3種類
IN — リストに含まれているか
EXISTS — 1行でも存在するか(パフォーマンス優秀)
EXISTS は最初の行が見つかった時点で終了する → 大きなテーブルでは IN より速いことが多い。
スカラーサブクエリ — 1つの値 のみを返す
SELECT 句で 各行ごとに1回実行される — 小さなテーブル以外では JOIN に書き換えた方が 速い。
GROUP BY — 集計関数とセットで使う
GROUP BY に含まれていないカラム を SELECT に書くと エラー(または非標準の動作)になる。集計関数は5種類:
- ▸
COUNT(*)— 行数 - ▸
SUM(col)— 合計 - ▸
AVG(col)— 平均 - ▸
MAX(col)/MIN(col)— 最大 / 最小
HAVING vs WHERE
WHERE はグループ化前のフィルタ、HAVING はグループ化後のフィルタ。
HAVING で集計関数が使える のが本質的な違い。WHERE では SUM() は使えない。
ORDER BY · LIMIT
3ページ目のデータ(1ページあたり10件) を取得する。ページネーションの基本パターン。
実践でまとめる — 上位ユーザー TOP 5
JOIN + GROUP BY + HAVING + ORDER BY + LIMIT — 実務のクエリの90%がこの組み合わせです。
🤖 AI にこう質問してみましょう
このレッスンの概念を身につければ、AI に 具体的に 指示できるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。
- ▸「users · orders · products の3テーブルを設計し、FK と INDEX まで作成して」
- ▸「直近7日間に登録したユーザー数を日別に集計するクエリを書いて」
- ▸「このクエリに EXPLAIN を付けて実行計画を解説して」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても 「それは何ですか?」 ともう一度聞かなければなりません。その「再質問」がトークンを消費します。概念を一度身につければ 会話が一回で終わります。