最終更新日:2026年6月28日
ds sql
DS検定トップ
> INとEXISTSの違いとは?値比較と存在判定を整理【DS検定】
まず結論
- IN=値がリストに含まれるかを判定
- EXISTS=条件に合うデータが存在するかを判定
- DS検定では「値を見るのか・存在を見るのか」を見抜くことが重要
直感的な説明
例えば「注文したことがある顧客」を探す場合
IN
👉 顧客IDが注文リストに含まれているか
EXISTS
👉 注文データが存在するか
👉 結果は同じでも「考え方」が違う
定義・仕組み
IN
SELECT *
FROM 顧客
WHERE 顧客ID IN (
SELECT 顧客ID FROM 注文
);
- サブクエリの「値の集合」と比較
EXISTS
SELECT *
FROM 顧客 A
WHERE EXISTS (
SELECT 1
FROM 注文 B
WHERE A.顧客ID = B.顧客ID
);
- 条件を満たす行が存在するかを判定
EXISTSのサブクエリでは、外側の行と内側の行を結ぶ相関条件が重要です。上の例では A.顧客ID = B.顧客ID がないと、「その顧客に注文があるか」ではなく「注文が1件でもあるか」という別の判定になります。
どんな場面で使う?
IN
- 値のリストと比較したいとき
- 小さいデータや単純な条件
EXISTS
- 関連データの有無を確認したいとき
- 外側の各行について、関連データの有無を確認したいとき
INとEXISTSの性能は、データ量だけで一律には決まりません。DBMS、インデックス、実行計画によって同等の処理へ最適化されることもあります。「大きいデータなら必ずEXISTSが速い」ではない点に注意します。
よくある誤解・混同
❌ INとEXISTSは同じ
→ ⭕ 結果は同じでも意味が違う
👉 DS検定ではここがひっかけ
❌ INは常に速い
→ ⭕ データ量が多いとEXISTSの方が有利
❌ EXISTSは値を比較している
→ ⭕ 存在だけを見ている
❌ INはNULLでも問題ない
→ ⭕ NULLが含まれると挙動に注意
👉 DS検定では「NULLを含むIN」がよく出る
特に NOT IN の候補集合にNULLが含まれると、SQLの三値論理により期待どおりの行が返らないことがあります。「関連行が存在しないもの」を探す場合は、相関条件を正しく書いた NOT EXISTS が意図を表しやすい方法です。
まとめ(試験直前用)
- IN=値の一致を見る
- EXISTS=存在を見る
- 結果が同じでも考え方が違う
- EXISTSは相関条件を満たす行が1件見つかればTRUE
- 性能はDBMSや実行計画次第で、EXISTSが常に速いわけではない
NOT INとNULLの組合せに注意する- 「値か存在か」で判断する
対応スキル項目(データエンジニアリング力シート)
- データ基盤
- データ操作
- ★ SQLを用いた基本的なデータ操作(検索・集計・結合等)ができる
🔗 関連記事
- 参照制約とは?FOREIGN KEY・REFERENCESと外部キーの意味【基本情報技術者試験】
- COUNT DISTINCTとは?ユニーク数を数える方法【DS検定】
- DDLとDMLの違いとは?CREATE・SELECTはどっち?【DS検定】
- JOINとは?テーブル結合の基本を理解する【DS検定】
- WHERE句とは?条件抽出の基本を理解する【DS検定】