LEFT / RIGHT / FULL JOIN の使い方
相手がいなくても行を残す
書き方
FROM a LEFT JOIN b ON … FROM a RIGHT JOIN b ON … FROM a FULL OUTER JOIN b ON …
LEFT JOIN は左の表の行をすべて残し、相手がいない列は NULL。WHERE b.id IS NULL で「相手のいない行」を探せます。
よく使うオプション
| オプション | 意味 |
|---|---|
LEFT JOIN | 左の表の行をすべて残す(相手が無い列は NULL) |
RIGHT JOIN | 右の表の行をすべて残す |
FULL OUTER JOIN | 両方の表の行をすべて残す |
例
SELECT d.name, COUNT(e.id)
FROM departments d
LEFT JOIN employees e ON e.dept_id = d.id
GROUP BY d.name; name | count
------+-------
営業 | 10
開発 | 12
広報 | 0
(3 rows)部署ごとの人数を、社員のいない部署も 0 として出します。COUNT(e.id) は NULL を数えないので 0 になります。
SELECT c.name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULL;
一度も注文していない客を出します。相手のいない行は o.id が NULL になるのを使います。
SELECT d.name, e.name FROM departments d FULL OUTER JOIN employees e ON e.dept_id = d.id;
社員のいない部署も、部署の決まっていない社員も、どちらも残して出します。
よくある間違い・注意
- LEFT JOIN の後で WHERE に右の表の条件(WHERE o.status = 'paid' など)を書くと、NULL の行が消えて INNER JOIN と同じになります。右の表の条件は ON に書きます。
- RIGHT JOIN は、表の順番を入れ替えた LEFT JOIN と同じです。LEFT JOIN にそろえると読みやすくなります。
- MySQL には FULL OUTER JOIN がありません。LEFT JOIN と RIGHT JOIN を UNION でつなげます。
実際に打って練習する
SQL コースの Lv28「相手がいなくても残す LEFT JOIN」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。