集合に対する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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- LIKEパターンとワイルドカード
- 集合に対するINとNOT IN
- 範囲に対するBETWEEN
- IS NULL、IS NOT NULLとCOALESCE