頻出高 ⏱ 6分★★★★★

JOINの基本

5種の結合・3テーブルJOIN・USING・非等値結合を完全網羅

正規化によって分割された複数のテーブルを共通列(結合キー)で横に連結し、必要な情報を 1 つの結果セットとして取り出す SQL の核心操作。

JOIN の概念:分割データを再結合する
受注顧客JOIN 結果
受注ID顧客ID顧客ID顧客名受注ID顧客ID顧客名
001C01C01山田001C01山田
002C02C02鈴木002C02鈴木
JOIN の条件列を 結合キー と呼ぶ。通常は「外部キー(多側)= 主キー(1 側)」の等値条件。
5 種の JOIN と結果の違い
種類SQL キーワード結果に含まれる行
内部結合INNER JOIN(= JOIN)両テーブルで結合キーが一致する行のみ
左外部結合LEFT OUTER JOIN左テーブル全行+右が一致した行(なければ NULL)
右外部結合RIGHT OUTER JOIN右テーブル全行+左が一致した行(なければ NULL)
完全外部結合FULL OUTER JOIN両テーブルの全行(不一致側は NULL)
交差結合CROSS JOIN全組み合わせ(直積 N×M 行)
SELECT a.列1, b.列2
FROM   テーブルA a
JOIN   テーブルB b
  ON   a.結合キー = b.結合キー
WHERE  追加条件;
ON 句を省略(または FROM A, B 形式)すると CROSS JOIN(直積)になる。100行×1000行=10万行になることがあるため必ず ON を書く。
-- 受注 → 受注明細 → 商品 の 3 テーブル結合
SELECT
  o.受注ID,
  d.商品ID,
  p.商品名,
  d.数量,
  p.単価 * d.数量 AS 小計
FROM   受注     o
JOIN   受注明細 d ON o.受注ID = d.受注ID
JOIN   商品     p ON d.商品ID = p.商品ID
WHERE  o.受注日 >= '2024-01-01';
JOIN は左から順に評価される。テーブルの記述順序は INNER JOIN では結果に影響しないが、実行計画に影響する場合がある。
-- ON 句で書く場合
SELECT * FROM 受注 o JOIN 顧客 c ON o.顧客ID = c.顧客ID;

-- USING で簡潔に(列名が両テーブルで同じ場合)
SELECT * FROM 受注 JOIN 顧客 USING (顧客ID);

USING を使うと結合列が結果に 1 列だけ出力される(ON では両テーブル分が別々に出る)。

-- 金額が価格レンジに入る行を結合(非等値結合)
SELECT o.受注ID, d.割引率
FROM   受注 o
JOIN   割引テーブル d
  ON   o.金額 BETWEEN d.下限 AND d.上限;

-- 複合キー結合(複数列が一致する行を結合)
SELECT * FROM 在庫 i
JOIN   商品マスタ m
  ON   i.倉庫ID = m.倉庫ID
  AND  i.商品ID = m.商品ID;
ON 条件の誤りで行数が爆発する
テーブル Aテーブル BCROSS JOIN 結果行数
100 行100 行10,000 行
1 万行1 万行1 億行(処理不能)

📝 理解度チェック

ON 句を省略して JOIN を書くとどうなるか?
3 テーブルを JOIN する正しい構文はどれか?
USING(列名)の特徴として正しいのはどれか?

読了ボタンを押すとトップページの進捗に反映されます