SQLのEXISTS・NOT EXISTS・IN・NOT INの違いを初心者向けに簡単解説|使い分けと注意点まとめ

SQL Server

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初心者のうちは、「値を見るのか」「行の存在を見るのか」を意識すると理解しやすくなるでしょう。

コメント

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