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

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