SQL設計・ウィンドウ関数・関係代数 重要度:★★★出題: AM2・PM1・PM2
相関副問合せとEXISTS / NOT EXISTS述語
そうかんふくといあわせといぐじすつじゅつご / Correlated Subquery & EXISTS / NOT EXISTS
外側の主問合せの候補行の値を内側の副問合せの検索条件で参照しながら評価を行う副問合せと、条件を満たす行の存在有無を判定する述語。
3行速習ポイント
- EXISTSは副問合せが1行でも結果を返した時点でTRUEとなり探索を打ち切るため、大量データに対する存在チェックで高速に動作する
- NOT IN は副問合せの結果に1件でもNULLが含まれると全体がUNKNOWN(結果0件)になる罠があるが、NOT EXISTSはNULLの影響を受けず安全に差集合(未登録・未実績行)を抽出できる
- 二重否定(NOT EXISTS ... NOT EXISTS)を用いることで、関係代数の「商演算(すべての〇〇を満たす△△)」をSQLで表現できる
図解
図NOT IN と NOT EXISTS の挙動比較
NOT IN (副問合せ)NULLに脆弱
副問合せ結果に1件でもNULLが含まれると評価がUNKNOWNになり抽出結果が0件になる
NOT EXISTS (相関副問合せ)安全・高速
行の存在有無(TRUE/FALSE)のみで判定するためNULLの影響を受けず1件ヒットで高速打切り
概要と本質
午前IIのSQL問題および午後IのSQL穴埋め問題で頻出の構文です。特に「一度も注文がない顧客」「すべての必須研修を受講完了した社員」「最新の履歴行のみを抽出するクエリ」などで相関副問合せが活躍します。
重要ポイント・コア概念
- NOT IN と NULL の罠:`WHERE x NOT IN (10, 20, NULL)` は `x <> 10 AND x <> 20 AND x <> NULL` と等価になり、3値論理で常にUNKNOWNとなるため1行も抽出されない
- NOT EXISTS の結合条件:副問合せ内のWHERE句で必ず外側テーブルのキーと内側テーブルのキーを等値結合(`WHERE A.コード = B.コード`)する
- EXISTS副問合せのSELECT句には何を指定しても評価結果に影響しないため、慣例的に `SELECT 1` または `SELECT *` と記述する
午後I・午後II記述試験での攻略ポイント
午前IIで「同じ結果を得るSQLはどれか(またはNULLが含まれる場合に結果が異なるものはどれか)」が出たら、まず `NOT IN` と `NOT EXISTS` のNULL挙動の違い、および `LEFT OUTER JOIN ... WHERE 右表.主キー IS NULL` との等価性を確認してください。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える