Oracle SQL(6)


サブクエリ
  • 以前に学習された結合は、1つ以上のテーブルで必要なデータをクエリーする際に使用される方法です.
  • サブクエリは、SELECTが必要なデータをクエリできない場合に使用する方法であり、複数のSELECT文を1つの実行可能なSQL文に統合して必要なデータをクエリできます.
  • -基本構文
    SELECT 컬럼
    FROM 테이블
    WHERE 컬럼명 연산자 (
    SELECT 컬럼
    FROM 테이블
    [WHERE 조건]);
    
    SELECT sal
    FROM emp
    WHERE ename = 'SMITH'; -- 800
    -- +
    SELECT ename, sal
    FROM emp
    WHERE sal < 800;
    -- 위 두 개의 쿼리를 합친 것이 아래의 하나의 쿼리문이다.
    SELECT ename, sal
    FROM emp
    WHERE sal < (
    SELECT sal
    FROM emp
    WHERE ename = 'SMITH');
  • 外部クエリをMainquery、内部クエリをSubqueryと呼びます.
  • 子キュリーではORDER BY節は使用できません.
  • サブクエリは、SELECT、FROM、WHERE、HAVING、ORDER BY、UPDATE、INSERT INTOセクションにも使用できます.
  • サブクエリのタイプ
    タイプ説明使用可能な演算子1行サブクエリの実行結果は、=、>、>=、<、<=、!=の1行を返します.同様の比較演算子は、サブクエリサブクエリの実行結果を繰り返して複数行を返します.IN、ANY、ALL、EXIST演算子
    1行サブクエリ
  • 単行サブクエリとは、サブクエリを実行し、ローを返さなければならないサブクエリのことです.
  • プライマリ・キーを使用するか、MAX、MIN、SUMなどの関数のグループを使用して検索する場合は、1行演算子を使用してプライマリ・クエリと演算する必要があります.
  • SELECT ename
    FROM emp
    WHERE ename != 'SMITH'
    AND deptno = (
    SELECT deptno
    FROM emp
    WHERE ename = 'SMITH');
    
    -- 사원들의 평균 월급보다 급여가 높은 사람의 이름과 월급 출력
    SELECT ename, sal
    FROM emp
    WHERE sal > (
    SELECT AVG(sal)
    FROM emp);
    
    -- 부서번호가 10번인 부서의 최대월급을 받는 사원이름과 월급 출력
    SELECT ename, sal 
    FROM emp
    WHERE sal = (
    SELECT MAX(sal)
    FROM emp
    WHERE deptno = 10);
    
    -- 여러 개의 서브 쿼리 사용 가능
    SELECT empno, ename, job, hiredate, sal
    FROM emp
    WHERE job = (SELECT job
    FROM emp
    WHERE empno = 7521)
    AND
    sal > (
    SELECT sal
    FROM emp
    WHERE empno = 7934);
    
    
    SELECT deptno, MIN(sal)
    FROM emp
    GROUP BY deptno
    HAVING MIN(sal) > 
    (SELECT MIN(sal)
    FROM emp
    WHERE deptno = 20)
    複数行サブクエリ
  • 複数行のサブクエリは、サブクエリを実行し、結果が1行または複数行の場合に使用されるサブクエリです.
  • タイプ説明INマスタークエリとサブクエリをIN演算子で比較します.サブクエリの結果値が複数の場合に使用します.ANYANY演算子は、複数行のサブクエリで>または<等比較演算子を使用するために使用され、検索条件が一致する場合は真です.ALLALL演算子は、複数行のサブクエリで>または<等比較演算子を使用するために使用され、検索条件のすべての値が一致する場合は真です.EXISTサブクエリの戻り値が存在する場合はプライマリクエリが実行され、戻り値がない場合はプライマリクエリは実行されません.
    IN演算子
  • IN演算子は、サブクエリの戻り値が複数で、メインクエリと等しい演算子で比較するときに使用される演算子です.
  • SELECT ename, sal
    FROM emp
    WHERE sal IN (
    SELECT sal
    FROM emp
    WHERE ename IN ('SMITH', 'ALLEN'));
    
    SELECT ename, sal
    FROM emp
    WHERE sal IN
    (SELECT sal
    FROM emp
    WHERE ename IN ('WARD', 'SMITH'));
    
    SELECT ename, deptno, sal
    FROM emp e
    WHERE deptno IN (
    SELECT deptno
    FROM emp
    WHERE sal >= 1000);
    
    SELECT empno, ename, job, hiredate, sal, deptno
    FROM emp
    WHERE sal IN (
    SELECT MIN(sal)
    FROM emp
    GROUP BY job);
    ALL演算子
  • 行のサブクエリで、>または<等比演算子を使用します.
  • ALL演算子は、サブクエリで返されるすべてのローの条件が満たされる必要があることを意味します.
  • メインクエリでは、クエリがタイプの説明>ALL(サブクエリ)サブクエリよりも大きいすべてのデータが返されます.これは、サブツリーが返す最大値よりも大きいデータをクエリーするときに使用されるサブクエリーです.SELECT empno, ename, sal FROM emp WHERE sal < ALL ( SELECT sal FROM emp WHERE job = 'MANAGER');ANY演算子
    これは、
  • を返すすべてのローについて、1つ以上の条件を満たすだけでよいことを意味する.
  • プライマリ・クエリーでは、タイプの説明>ANY(サブクエリー)サブクエリーで1つ以上の条件が一致するビッグデータを返すだけです.これは、サブツリーが返す最小値よりも大きいデータをクエリーするときに使用されるサブクエリーです.<プライマリ・クエリーでは、ANY(サブクエリー)サブクエリーで1つ以上の条件が一致する小さなデータを返すだけです.最終的には、サブクエリが返す最大値より小さいデータをクエリするときに使用されるサブクエリです.
    SELECT empno, ename, sal
    FROM emp
    WHERE sal < ANY (
    SELECT sal
    FROM emp
    WHERE job = 'MANAGER');
    EXISTS演算子
  • サブクエリに結果があるかどうかを判断する演算子.
  • サブクエリの結果がない場合、FALSEが返されます.
  • がある場合、TRUEに戻る.
  • SELECT *
    FROM emp
    WHERE EXISTS ( SELECT empno
    FROM emp
    WHERE comm IS NOT NULL);
    複数列サブクエリ
  • サブクエリで複数のカラム値を検索し、メインクエリ条件セクションと比較したサブクエリ.
  • 列をペアにして同時に比較するペア方式と、列ごとに比較してAND演算処理を行う非ペア方式がある.
  • -- pairwise
    SELECT deptno, empno, ename, sal
    FROM emp
    WHERE (deptno, sal) IN (SELECT deptno, MAX(sal)
    FROM emp
    GROUP BY deptno);
    行内ビュー
  • FROMセクションではサブクエリも使用できます.これにより、FROMセクションで使用されるサブクエリはインラインビューと呼ばれます.
  • サブクエリは、仮想テーブルを返すために使用されます.
  • これは、
  • FROMセクションで使用されるサブクエリがビューと類似しているためです.
  • SELECT 컬럼
    FROM (서브쿼리) alias
    WHERE 조건식;
    
    SELECT e.deptno, total_sum, total_avg, cnt
    FROM (SELECT deptno, sum(sal) total_sum, avg(sal) total_avg, count(*) cnt
    FROM emp
    GROUP BY deptno) e, dept d
    WHERE e.deptno = d.deptno;