ORACLE SQL リファレンス(逆引き)

ORACLE SQL リファレンス

Web oracle.se-free.com
レコードの存在の有無を条件にする(EXISTS)
スポンサード リンク

レコードの存在有無を条件にするにはEXISTSを使用します

[NOT] EXISTS (SELECT文) SELECT文による副問合せの結果、行が1行以上戻される場合には、TRUEと評価されます
 IN句を使用するより、EXISTS句を使用する方が、パフォーマンスが大幅に改善されることがあるので、IN句を使用するときは、EXISTS句で代替することも検討しましょう。詳細はチューニングを参照。

サンプル表「emp」データ
SQL> select * from emp;

EMP DEP NAME     SALARY
--- ---  ---------- ----------
E01 D01 なまえ1    96
E02 D01 なまえ2    105
E03 D02 なまえ3    300

SQL>


サンプル表「dept」データ
SQL> select * from dept;

DEP DEPT_NAME
--- ----------
D01 総務
D02 営業
D03 開発
D05
D04 営業


例1) 表「emp」の列「dept_id」が'D03'のレコードが存在する場合、表「dept」を検索する(EXISTS)

SQL> select * from dept
 2   where exists( select 'X' from emp where dept_id = 'D03' );

レコードが選択されませんでした。
定数'X'はEXISTS句を使用する場合の慣例です。ここには上記の様な定数を指定しましょう


例2) 表「emp」の列「dept_id」が'D03'のレコードが存在しない場合、表「dept」を検索する(NOT EXISTS)

SQL> select * from dept
 2    where not exists(select 'X' from emp where dept_id = 'D03');

DEP DEPT_NAME
--- ----------
D01 総務
D02 営業
D03 開発
D05
D04 営業


例3) 表「dept」の列「dept_id」のデータが表「emp」の列「dept_id」に存在するレコードを検索する。(EXISTS)

SQL> select * from dept A
 2    where exists( select 'X' from emp B where A.dept_id = B.dept_id );

DEP DEPT_NAME
--- ----------
D01 総務
D02 営業


例4) 表「dept」の列「dept_id」のデータが表「emp」の列「dept_id」に存在しないレコードを検索する。(NOT EXISTS)

SQL> select * from dept A
 2    where not exists( select 'X' from emp B where A.dept_id = B.dept_id );

DEP DEPT_NAME
--- ----------
D04 営業
D03 開発
D05


スポンサード リンク


基本的な比較(=、<>、> など)
論理比較(AND、OR、NOT)
文字列の一部と比較(LIKE)
文字列の一部を正規表現を使用して比較(REGEXP_LIKE)
NULLデータの比較
複数の値の候補を指定する(IN、ANY、SOME、ALL)
レコードの存在の有無を条件にする(EXISTS)

SQL(DML) へ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ