IN述語とは?いんじゅつご
IN述語とは、左辺の値が、括弧内に列挙した値の並びか、副問合せが返す結果集合のいずれかに含まれるかを判定する述語。= ANY と等価で、同じ列に対する複数のORを1つの所属関係として簡潔に書ける。副問合せを伴う形は、最適化の過程で結合や準結合(セミジョイン)へ書き換えて実行されることが多い。
最終更新:2026-10-06
この語が出る過去問を解く →背景
同じ列への等値比較をORで並べる書き方は、条件が増えるほど読みにくく書き間違えも増える。それ以上に、「別の表に存在する値のどれか」という条件はORでは書き表せず、集合に対する所属という形が必要だった。db試験では、この述語が実行計画上は結合として処理されるという点、つまり書き方と処理のされ方が一対一ではないことを理解しているかが論点になる。
具体例
キャンペーン対象の会員だけを抜くなら WHERE 会員番号 IN (SELECT 会員番号 FROM 対象者表) と書ける。列挙形なら WHERE 予約状態 IN ('仮予約','確定','変更中') となり、ORを3つ並べた式と意味は同じだが読み違えにくい。実行計画を見ると、前者は対象者表を一意化してからハッシュ結合する形へ展開されていることが多い。
試験での引っ掛け
否定形の NOT IN が要注意で、副問合せの結果にNULLが1つでも混じると比較が不定になり、結果が常に空になる。NOT EXISTS へ書き換えるとこの挙動を避けられるため、両者は等価ではない。肯定形のINでは副問合せ側に重複があっても結果に影響しないが、単純に内部結合へ書き換えると行が増えてしまう点も、対応関係として押さえておく。
関連用語
出た過去問
出典:平成28年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9(IPA)解説で登場
次のSQL文と同じ検索結果が得られるSQL文はどれか。 SELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE COL1 IN (S…
正解:SELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
要点:IN述語の副問合せは相関EXISTSに等価変換できる
IN述語による副問合せは、外側の行の値が副問合せの結果集合に含まれるかを判定するもので、相関副問合せを使ったEXISTS述語に書き換えられる。どちらもTBL2に同じCOL1の値が1件でもあればその行を残すという意味になり、結果は一致する。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。