EXISTS入門:存在チェックの基本と落とし穴(IN・NULL・重複)
この記事で分かること
EXISTSの基本形(相関サブクエリ)を、最小パターンで理解できるINとEXISTSの「まずはこう選ぶ」判断基準が分かる- NULLや重複で「動くけど間違う」事故を避けられる
前提
SELECT/WHERE/JOINの基本は知っている- まだSQLに慣れていなくてもOK(コードは短めにする)
結論:迷ったらまずは EXISTS
「条件を満たす行が”あるかどうか”」だけを確認したいなら、まず EXISTS を使うのが安全です。特に
IN (subquery) は、サブクエリ結果にNULLが混ざると意図しない挙動になりやすいので注意が必要です。
EXISTSの最小形(まずこれだけ)
「注文が1件でもある顧客」だけを取りたい例です。
SELECT
c.*
FROM
customers AS c
WHERE
EXISTS (
SELECT
1
FROM
orders AS o
WHERE
o.customer_id = c.id
);
つまずきポイント
- 相関条件(
o.customer_id = c.id)を書き忘れると、全件TRUEになって事故ります
INとEXISTSの使い分け(まずはこの基準)
- 存在チェック:
EXISTS - 候補リストに含まれるか:
IN(ただしNULLを意識)
INで起きやすいNULL事故(要注意)
NOT IN
とNULLが組み合わさると、直感に反する結果になりやすいです。このパターンに出会ったら、NOT EXISTS
を優先的に検討してください。
NOT EXISTSの例(「注文がない顧客」)
SELECT
c.*
FROM
customers AS c
WHERE
NOT EXISTS (
SELECT
1
FROM
orders AS o
WHERE
o.customer_id = c.id
);
練習問題(3問)
- 注文が1件でもある顧客を抽出する(
EXISTS) - 注文がない顧客を抽出する(
NOT EXISTS) - 「特定の商品を買った顧客」だけを抽出する(
EXISTS。ordersとorder_itemsがある想定)
