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 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。

SQL 構文一覧(使い方と例)へ戻る