EXISTS の使い方
対応する行があるか
書き方
WHERE EXISTS (SELECT 1 FROM … WHERE 外側との条件)
外側の行ごとに副問い合わせを調べます(相関副問い合わせ)。NOT EXISTS は「ない」もの。
よく使うオプション
| オプション | 意味 |
|---|---|
EXISTS (SELECT …) | 副問い合わせが 1 行でも返せば真 |
NOT EXISTS (SELECT …) | 1 行も返らなければ真 |
例
SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
注文したことのある客を出します。客 1 人ごとに、その客の注文があるかを調べます。
SELECT name FROM departments d
WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.dept_id = d.id); name
------
広報
(1 row)社員が 1 人もいない部署を出します。
SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id AND o.total >= 30000);
3 万円以上の注文をしたことのある客を出します。中の WHERE に条件を足せます。
よくある間違い・注意
- EXISTS は「行があるか」だけを見るので、中の SELECT に何を書いても結果は同じです。SELECT 1 と書くのがよくある形です。
- 中で外側の表(c.id など)とつなぐ条件を忘れると、全員に同じ答えが出ます。
- NOT IN と違い、NOT EXISTS は NULL があっても思ったとおりに動きます。
実際に打って練習する
SQL コースの Lv33「行ごとに問い合わせる EXISTS」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。