C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]7. 다중 열 서브쿼리(Subquery) 본문

Programming/Oracle 공부

[Oracle/기본]7. 다중 열 서브쿼리(Subquery)

19760323 2017. 5. 23. 11:08

● 다중열 서브 쿼리

   

여러개의 컬럼을 검색하는 서브 쿼리

 

- 서브 쿼리의 SELECT 문에 여러 개의 컬럼을 검색한다.

- 반드시 비교 대상 컬럼과 1:1 대응돼야 한다.

- 다중 열 서브쿼리는 주로 IN을 사용하지만 '='사용도 가능하다. IN의 사용이 권장된다.

 

Ex. 각 부서별로 최소 급여를 받는 사원의 정보를 검색. (Pairwise 방식)

    SELECT dept_ID, employeeID, first_name, salary

      FROM emp

    WHERE (dept_ID, salary) IN (SELECT dept_ID, MIN(salary)

                                          FROM emp

                                    GROUP BY dept_ID)

 

● 다중 열 서브쿼리에서의 열 비교

 

- Pairwise 방식.

 

  SELECT empno, sal, deptno

   FROM emp

  WHERE (sal, deptno) IN (SELECT sal, deptno

                                    FROM emp

                                  WHERE deptno = 30

                                     AND comm is NOT NULL);

  ☞ 서브쿼리의 조건에 대하여 교집합의 개념

 

- Non Pairwise 방식.

 

  SELECT empno, sal, deptno

   FROM emp

  WHERE sal IN (SELECT sal

                       FROM emp

                      WHERE deptno = 30

                         AND comm is NOT NULL)

     AND deptno IN (SELECT deptno

                            FROM emp

                          WHERE deptno = 30

                             AND comm is NOT NULL);

 

   ☞ 서브쿼리의 조건에 대하여 합집합의 개념 (두 서브쿼리의 조건이 서로 다를 수도 있음)

 

예를들어, 서브쿼리의 결과가 (1, a), (2, b) 의 2건이 나오면,

Pairwise 쿼리는, (1, a), (2, b) 가 나온다.

NonPairwise 쿼리는, (1, a), (1, b), (2, a), (2, b)가 나올 수 있다.

 

● 서브쿼리에서의 NULL 값

 

NOT IN 연산자로 이어지는 서브쿼리의 결과값 중 하나라도 NULL값이면, 행이 없다고 리턴한다.

따라서, 서브쿼리의 결과값 중 하나라도 NULL인 값이 있으면 NOT IN 연산자를 사용하면 안된다. (IN은 가능)

 

● FROM 절에서의 서브쿼리 사용.

 

Ex. SELECT a.ename, a.sal, a.deptno, b.salavg

     FROM emp a, (SELECT deptno, avg(sal) salavg

                          FROM emp

                    GROUP BY deptno) b

    WHERE a.deptno = b.deptno

       AND a.sal > b.salavg;

 

부서의 평균 급여 이상을 받는 모든 종업원에 대해서 종업원 이름, 급여, 부서번호, 평균급여를 디스플레이한다.

 

 

Comments