EXISTS 条件
SQL において使用することができる条件
EXISTS も IN も一般的にどちらも期待どおりの結果を得ることができるが NOT IN と NOT EXISTS では、特に NOT IN で期待していた内容と大きな違いがででしまう。これが忘れた頃にタイミング悪く遭遇するものだから要注意である。
EXISTS
EXISTS に続く括弧で囲まれた副問い合わせにおいて、結果行が「存在すれば 真(TRUE)」、「存在しなければ 偽(FALSE)」を戻す。主に相関副問い合わせを使って記述する。
副問い合わせで戻されるレコード数は1レコードでも複数レコードでも同じ TRUE である。
サンプルデータ
SQL> set null <NULL>
SQL> select * from staff ;
STAFF_ID NAME MANAGER_ID
-------- ---------- ----------
000 ボス <NULL>
100 部下その1 000
101 部下その2 000
exists を使用した場合
-- 部下をもつ社員の一覧を取得する SQL (EXISTS 編)
SQL> select * from staff T1 where exists
( select * from staff T2 where T1.staff_id = T2.manager_id) ;
STAFF_ID NAME MANAGER_ID
-------- ---------- ----------
000 ボス <NULL>
EXISTS と IN
IN を使用した場合
-- 部下をもつ社員の一覧を取得する SQL (IN 編)
SQL> select * from staff T1 where staff_id in
( select manager_id from staff T2 ) ;
STAFF_ID NAME MANAGER_ID
-------- ---------- ----------
000 ボス <NULL>
NOT EXISTS と NOT IN の検索結果の違い
exists を使用した場合
-- 部下がいない社員の一覧を取得する SQL (NOT EXISTS 編)
SQL> select * from staff T1 where not exists
( select * from staff T2 where T1.staff_id = T2.manager_id) ;
STAFF_ID NAME MANAGER_ID
-------- ---------- ----------
101 部下その2 000
100 部下その1 000
NOT IN (副問い合わせ) で副問い合わせに NULL が含まれる場合
-- 部下がいない社員の一覧を取得する SQL (NOT IN 編)
SQL> select * from staff T1 where staff_id not in
( select manager_id from staff T2 ) ;
レコードが選択されませんでした。
NOT IN (副問い合わせ) の副問い合わせにおいて NULL を戻す結果が含まれる場合、結果は不定 (UNKNOWN) になるため NOT EXISTS の場合と異なる検索結果となる。
⇒ IN と EXISTS 2つの副問い合わせの違い / NULL 値 / NULL の特性
EXISTS 条件に関連する内容