-1つ以上の行を返すSubquery
-論理演算子(IN, NOT IN, ANY, ALL, EXISTS)のみ使用可能
■IN演算子
-IN演算子は1つのコラムに複数の'='条件を持つ場合使用
-ORはINを含む。INで表現できるのはORでも表現できる。
-しかし、ORでの表現をINで表現出来ない場合もある。(ORでLIKEなどを使用した場合)
-INは必ず1つのコラムが比較されるので後々INDEX構成の参考に有利
-結論的にはORよりINを使用するのが望ましい
--部署別に給与が一番高い社員の情報を出力
SQL> SELECT empno,ename,sal,deptno
2 FROM emp
3 WHERE sal IN (SELECT MAX(sal)
4 FROM emp
5 GROUP BY deptno);
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7698 BLAKE 2850 30
7788 SCOTT 3000 20
7839 KING 5000 10
7902 FORD 3000 20
■ANY演算子
-ANY演算子はSubqueryの複数の結果からどれか1つだけでも条件に合えば行を返す
--SALEMANより給与が高い社員の名前と給与を出力 SQL> SELECT ename, sal 2 FROM emp 3 WHERE deptno != 20 4 AND sal > ANY(SELECT sal 5 FROM emp 6 WHERE job = 'SALESMAN'); ENAME SAL ---------- ---------- KING 5000 BLAKE 2850 CLARK 2450 ALLEN 1600 TURNER 1500 MILLER 1300
■ALL演算子
-ALL演算子はSubquery結果すべてが条件に合えば行を返す
--すべてのSALESMANより給与が高い社員の社員名と給与を出力 SQL> SELECT ename, sal 2 FROM emp 3 WHERE deptno != 20 4 AND sal > ALL(SELECT sal 5 FROM emp 6 WHERE job = 'SALESMAN'); ENAME SAL ---------- ---------- CLARK 2450 BLAKE 2850 KING 5000
■EXISTS演算子
-EXISTS演算子はSubqueryデータが存在するかをチェックしTRUE/FALSEを返す。
-EXISTSには必ずメインクエリと繋がるJOIN条件が必要。
-subqueryで結果行が見つかったら、inner queryを中断し、TRUEを返す。
--empテーブルで社員が所属した部署番号のみ検索する場合、
--検索しようとする対象はdeptテーブルだが、empテーブルとJoinし部署番号をチェックする必要がある。
--2つのテーブルの関係が1:Mなのでempテーブルをすべてアクセスし、DISTINCTで重複を除去しなければならない。
SQL> SELECT DISTINCT d.deptno, d.dname
2 FROM dept d, emp e
3 WHERE d.deptno = e.deptno;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
--EXISTSを使用するSubqueryに変更!
--検索する対象のみFROMに入れてempテーブルはチェックだけするためにEXISTSに入れる
--これにより処理速度が早くなる。
SQL> SELECT d.deptno, d.dname
2 FROM dept d
3 WHERE EXISTS
4 (SELECT 1
5 FROM emp e
6 WHERE e.deptno = d.deptno);
DEPTNO DNAME
---------- --------------
20 RESEARCH
30 SALES
10 ACCOUNTING
0 件のコメント:
コメントを投稿