[Oracle] exists 述語

2013年8月8日

 相関サブクエリーといえば exists 述語ですが。
 この exists 述語。ぐぐっても、使用例が概ね複雑(=相関クエリー)で理解が難しかったりするので、メモがてらまとめ。

 exists とは 空集合(=∅)か、集合が存在するか(≠∅)を判定するための、関数らしきものです。

 たとえば、以下のように記述すると EMP 表の全レコード数を表示します。サブクエリーが1件データを戻すからです。

SQL> select count(*) from EMP
  2   where exists (select 1 from DUAL);

  COUNT(*)
----------
        14

 しかし、以下のように記述すると 0 を表示します。サブクエリーが1件もデータを戻さないから(=0件だから)です。

SQL> select count(*) from EMP
  2   where exists (select 1 from DUAL where DUMMY='A');

  COUNT(*)
----------
         0

 要するに、exists とは集合に対する「is not NULL」のようなもの、だと思えばよいです。

 exists は、非相関クエリーで使っても上記の通り結果は all or nothing にしかならないので、主に相関クエリーで使用されますが「exists = 相関クエリー」ではない点に注意です。

 

 「やっぱりピンとこない」という場合は、以下と等価だと思ってもらっても OK です。(論理的には。実行速度とかは別の話。)

select count(*) from EMP
 where (select count(*) from DUAL) <> 0;

  COUNT(*)
----------
        14

 

 

 

 ちなみに Oracle の DUAL 表とはこういう表。

SQL> select * from DUAL;

DUMMY
-----
X






カテゴリー: Oracle, データベース

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org