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 条件に関連する内容

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト