---
title: "INとEXISTSの違いとは？値比較と存在判定を整理【DS検定】"
description: "SQLのINとEXISTSの違いを整理します。値の集合と比較する考え方、条件を満たす行の存在を判定する考え方、サブクエリでの使い分けを押さえ、DS検定のSQL問題に備えます。本文では、用語の定義、具体例、似た概念との違い、試験で迷いやすい選択肢の見分け方まで、短時間で復習できるようにまとめています。"
last_modified_at: "2026-06-28"
canonical_url: "https://stemtazoo.github.io/ds/sql-in-exists/"
section: "ds"
---

<div style="font-size: 14px; margin-bottom: 12px;">
  <a href="/ds/">DS検定トップ</a>
  ＞ INとEXISTSの違いとは？値比較と存在判定を整理【DS検定】
</div>

## まず結論

* IN＝値がリストに含まれるかを判定
* EXISTS＝条件に合うデータが存在するかを判定
* DS検定では「値を見るのか・存在を見るのか」を見抜くことが重要

---

## 直感的な説明

例えば「注文したことがある顧客」を探す場合

### IN

👉 顧客IDが注文リストに含まれているか

### EXISTS

👉 注文データが存在するか

👉 結果は同じでも「考え方」が違う

---

## 定義・仕組み

### IN

```sql
SELECT *
FROM 顧客
WHERE 顧客ID IN (
    SELECT 顧客ID FROM 注文
);
```

* サブクエリの「値の集合」と比較

---

### EXISTS

```sql
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を用いた基本的なデータ操作（検索・集計・結合等）ができる

<hr>

<div style="margin-top: 16px;">
  🏠 <a href="/ds/">DS検定トップに戻る</a>
</div>
