頻出高 ⏱ 7分★★★★★

外部結合(OUTER JOIN)

NULL 保持・アンチジョイン・ON vs WHERE の落とし穴

一方のテーブルに一致する行がなくてもNULL を埋めて結果に残す結合。「全件残したい」テーブル側を LEFT/RIGHT で指定する。

「受注がない顧客も一覧に出したい」「未配送の受注を探したい」など、存在しないことを検出する場面で必須。
SELECT c.顧客ID, c.顧客名, o.受注ID, o.金額
FROM   顧客 c
LEFT OUTER JOIN 受注 o ON c.顧客ID = o.顧客ID;
顧客全員+受注情報(受注なし顧客は NULL)
顧客名受注ID金額
山田0015,000
鈴木00212,000
佐藤(受注なし)NULLNULL

LEFT に書いたテーブルの全行が必ず残る。一致しない右テーブルの列は NULL になる。

-- RIGHT JOIN
FROM 受注 o RIGHT OUTER JOIN 顧客 c ON o.顧客ID = c.顧客ID

-- 上記と同じ結果(テーブルの順序を入れ替えて LEFT に変換)
FROM 顧客 c LEFT OUTER JOIN 受注 o ON c.顧客ID = o.顧客ID
RIGHT JOIN は LEFT JOIN でテーブル順を入れ替えると代替できる。実務では LEFT JOIN に統一するチームが多い。
SELECT c.顧客名, o.受注ID
FROM   顧客 c
FULL OUTER JOIN 受注 o ON c.顧客ID = o.顧客ID;
FULL OUTER JOIN の結果パターン
顧客名受注ID状態
山田001両方一致
佐藤(受注なし)NULL顧客のみ存在
NULL099(顧客ID削除済)受注のみ存在
-- 受注が 1 件もない顧客を取得(アンチジョイン)
SELECT c.顧客ID, c.顧客名
FROM   顧客 c
LEFT JOIN 受注 o ON c.顧客ID = o.顧客ID
WHERE  o.受注ID IS NULL;  -- 一致しなかった行だけ選ぶ
アンチジョインは NOT IN / NOT EXISTS でも同等だが、LEFT JOIN + IS NULL が最も可読性・性能ともに良いケースが多い。
LEFT JOIN で条件を書く場所による結果の違い
条件の場所効果NULL 行の扱い
ON 句結合の絞り込み(結合前に適用)✅ NULL 行が残る
WHERE 句結合後の絞り込み❌ NULL 行が消える(INNER JOIN と同等)
-- ON に書く → 受注なし顧客も残る
FROM 顧客 c LEFT JOIN 受注 o
  ON  c.顧客ID = o.顧客ID AND o.金額 >= 5000

-- WHERE に書く → 受注なし顧客が除外される
FROM 顧客 c LEFT JOIN 受注 o
  ON  c.顧客ID = o.顧客ID
WHERE o.金額 >= 5000  -- NULL は条件を通過しない

📝 理解度チェック

LEFT OUTER JOIN で NULL になる列はどちらのテーブルの列か?
「受注が 1 件もない顧客を取得する」アンチジョインの正しい書き方はどれか?
LEFT JOIN 後に WHERE 右テーブル列 IS NOT NULL を指定した場合の結果はどれか?

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