SQLを学び始めると、WHERE句でよく見かける「IN」「NOT IN」「EXISTS」「NOT EXISTS」の違いで混乱する人は少なくありません。どれも“条件に一致するデータを探す”ための構文ですが、動き方やNULLの扱い、処理速度に違いがあります。この記事では、SQL初心者でも理解しやすいように、EXISTS・NOT EXISTS・IN・NOT INの違いを具体例付きで整理して解説します。
まずは4つの意味を簡単に整理
最初に、それぞれの役割をざっくり確認しておきます。
| 構文 | 意味 |
|---|---|
| IN | 含まれているか確認 |
| NOT IN | 含まれていないか確認 |
| EXISTS | 存在するか確認 |
| NOT EXISTS | 存在しないか確認 |
一見似ていますが、「値比較」なのか「存在確認」なのかが大きな違いです。
INとは?複数の値に含まれるか確認する
INは「この値は一覧の中にある?」を確認する構文です。
基本例
SELECT * FROM users WHERE prefecture IN ('東京','大阪','福岡');
これは「東京・大阪・福岡のいずれかに一致する人」を取得します。
OR条件をまとめて書けるのがINの特徴です。
ORで書くとこうなる
WHERE prefecture = '東京' OR prefecture = '大阪' OR prefecture = '福岡'
INを使うとコードがかなり見やすくなります。
NOT INとは?一覧に含まれないデータを取得する
NOT INはINの逆です。
基本例
SELECT * FROM users WHERE prefecture NOT IN ('東京','大阪');
これは「東京と大阪以外」を取得します。
ただし、NOT INには初心者がハマりやすい大きな注意点があります。
NULLがあると結果がおかしくなることがある
NOT INは、比較対象にNULLが含まれると正常に動かないケースがあります。
SELECT * FROM users WHERE id NOT IN (1,2,NULL);
この場合、結果が0件になることがあります。
そのため、実務ではNOT INよりNOT EXISTSを使うケースも多いです。
EXISTSとは?データが存在するか確認する
EXISTSは「条件に合う行が存在するか」を確認する構文です。
主にサブクエリと一緒に使います。
基本例
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
これは「注文履歴が存在するユーザー」を取得しています。
EXISTSは“値比較”ではなく、“行の存在”を見ています。
イメージしやすく言うと
- IN → 「一覧にある?」
- EXISTS → 「データ存在する?」
という違いです。
NOT EXISTSとは?存在しないデータを探す
NOT EXISTSはEXISTSの逆です。
基本例
SELECT * FROM users u WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
これは「注文履歴が一度もないユーザー」を取得しています。
NOT EXISTSはNULL問題に強いため、実務ではNOT INより安全と言われることがあります。
INとEXISTSの違いを簡単に比較
| 比較項目 | IN | EXISTS |
|---|---|---|
| 目的 | 値比較 | 存在確認 |
| 主な用途 | 固定一覧比較 | 関連データ確認 |
| NULL耐性 | 弱い | 強い |
| 大量データ | 遅くなる場合あり | 有利な場合あり |
特に大規模データベースでは、EXISTSのほうが高速になるケースがあります。
初心者がまず覚えるべき使い分け
最初は次の感覚で覚えると理解しやすいです。
- 固定リスト比較 → IN
- 関連データ存在確認 → EXISTS
- NOT INはNULL注意
- 迷ったらNOT EXISTSが安全
実際の開発現場では、パフォーマンスやNULL問題を考えてEXISTS系が好まれることもあります。
実例で見るイメージの違い
INの考え方
「この生徒はA組・B組・C組のどれか?」
EXISTSの考え方
「この生徒にテスト結果は存在する?」
つまり、INは“値”、EXISTSは“データ存在”を見るイメージです。
まとめ
SQLのIN・NOT IN・EXISTS・NOT EXISTSは似ているようで役割が異なります。INは値の一覧比較、EXISTSは条件に合うデータの存在確認です。特にNOT INはNULLで予期しない結果になることがあるため、実務ではNOT EXISTSが使われる場面も多くあります。SQL初心者のうちは、「値を見るのか」「行の存在を見るのか」を意識すると理解しやすくなるでしょう。


コメント