본문 바로가기

프로그래밍/오라클

[ORACLE] 서브쿼리 Subquery _ 오라클

[ORACLE] 서브쿼리 Subquery _ 오라클


서브쿼리 정의  |  

 쿼리안에 쿼리가 들어가 있는 쿼리문. 즉, 서브쿼리란 쿼리안에 또 다른 쿼리가 들어있는 쿼리를 말한다. 




서브쿼리 종류  | 

 인라인 뷰, 스칼라 서브쿼리, 기타





서브쿼리 예제  | 

--1. 기본형식
  SELECT  EMPNO AS 사번
    FROM  EMP
   WHERE  DEPTNO IN (
                      SELECT  DEPTNO
                        FROM  DEPT
                       WHERE  DNAME = 'SALES'
                    );

하나의 예시이다. SELECT절에 작성이 되면 스칼라 서브쿼리라 부르고, FROM절에 작성되면 인라인 뷰 서브쿼리라 부른다. 위와 같이 WHERE절에 작성이 될 수도 있다. 문제를 직접 풀면서 이해하자.




서브쿼리 문제  |

 부서별로 평균 급여보다 높은 급여를 받는 사원은? 

--1) 부서별 평균 급여구하기
  SELECT  AVG(SAL)
    FROM  EMP B
GROUP BY  DEPTNO; 

평균급여


문제를 보면 두가지 조건이 걸린 것을 확인 할 수 있다. 먼저, 부서별로 평균 급여를 구해야한다. 그리고 그 평균 급여보다 급여가 높은 사람을 구하라는 문제이다. 평균 급여보다 받는 급여가 더 큰 사원을 구해야한다. 이때 이 쿼리를 서브쿼리로 사용하면 문제는 간단히 풀린다.





--2) 문제_부서별로 평균 급여보다 높은 급여를 받는 사원은?             
  SELECT  A.ENAME, A.SAL
    FROM  EMP A
   WHERE  A.SAL > (
                    SELECT  AVG(SAL)
                      FROM  EMP B
                     WHERE  A.DEPTNO = B.DEPTNO
                  GROUP BY  DEPTNO
                  ); 

서브쿼리결과



여기서 우리가 유의깊게 봐야할 것은 서브쿼리에 작성된 WHERE절이다! 마치 조인의 ON 조건처럼 작성이 되어있는 것을 확인 할 수 있다. 만약 조건이 없다면 서브쿼리의 결과가 다중행으로 나오는데 어떤 것을 기준으로 비교해줘야 하는지 옵티마이저는 알 수 없기 때문이다. 따라서, 우리는 서브쿼리의 WHERE절에 조건을 설정해주어서 정확한 결과를 도출해낼 수 있다.




중요!

서브쿼리에서는 메인쿼리의 컬럼에 접근할 수 있지만, 메인쿼리에서 서브쿼리로는 접근이 불가하다! 기억하자!