EXISTS入門:存在チェックの基本と落とし穴(IN・NULL・重複)

EXISTS入門:存在チェックの基本と落とし穴(IN・NULL・重複)

この記事で分かること

  • EXISTS の基本形(相関サブクエリ)を、最小パターンで理解できる
  • INEXISTS の「まずはこう選ぶ」判断基準が分かる
  • 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. 注文が1件でもある顧客を抽出する(EXISTS
  2. 注文がない顧客を抽出する(NOT EXISTS
  3. 「特定の商品を買った顧客」だけを抽出する(EXISTSordersorder_items がある想定)

次に読む

タイトルとURLをコピーしました