0Pricing
SQL Academy · レッスン

集合に対するINとNOT IN

INとNOT INで値のリストに対して絞り込み、NOT INにおけるNULLの落とし穴を学び、安全な意味になるようEXISTSへ置き換えます。

「集合に対するINとNOT IN」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

IN:リストとの照合

INは複数のORを簡潔に書くための構文です。

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

サブクエリでのIN

右辺にサブクエリを使用できます。

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN:リストを除外する

一致する行を除外します。

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

NOT INとNULLの落とし穴

右辺にNULLが含まれていると、NOT INはNULLを返します。述語がNULLの行は除外されるため、結果は0行になります。

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

NOT EXISTSがより安全な理由

NOT EXISTSは標準的な相関サブクエリのセマンティクスを使用し、NULLの影響を受けません。ほとんどのプランナーは、正しく記述されたNOT INと同じように最適化します。

INとOR:可読性

INは長いORの連鎖よりも読みやすく、プランナーも多くの場合、同じように最適化します。

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

タプル(行コンストラクター)でのIN

複数の列の組み合わせを照合します。

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

インデックスの使用

インデックスが設定された列に対するINリストは、複数のインデックスルックアップ(Bitmap Index Scan)として実行できます。一般的に高速です。

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

大きなINリスト

数千個の値を含むリストは遅くなる可能性があります。次の方法を優先してください。

  • 実テーブルまたは一時テーブルとJOINする
  • 配列パラメーターを渡すために= ANY(array)を使用する
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

空のINリスト

空のINリストは標準SQLでは不正です。一部のクライアントは特別な代替値を渡しますが、SQLの条件を状況に応じて生成するほうが安全です。

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

INとJOIN

サブクエリのINよりも、JOINのほうが明確な場合があります。

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

まとめ

INは集合への所属を表す使いやすい構文です。

  • 可読性のため、ORよりINを使用する
  • NULLを含むNOT INは危険なため、NOT EXISTSを優先する
  • 大きな集合にはJOINまたは配列を使用する

クイックチェック

サブクエリにNULLが含まれる可能性がある場合、NOT IN (subquery)の最も安全な置き換えは何ですか。

よくある質問

「集合に対するINとNOT IN」レッスンは無料ですか?

はい。「集合に対するINとNOT IN」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「集合に対するINとNOT IN」で何を学びますか?

INとNOT INで値のリストに対して絞り込み、NOT INにおけるNULLの落とし穴を学び、安全な意味になるようEXISTSへ置き換えます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「集合に対するINとNOT IN」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. LIKEパターンとワイルドカード
  2. 集合に対するINとNOT IN
  3. 範囲に対するBETWEEN
  4. IS NULL、IS NOT NULLとCOALESCE
← SQL Academyに戻る