ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] 서브쿼리(Subquery)
    RDS/Oracle 2019. 3. 18. 07:30
    반응형

    서브쿼리(Subquery)

     서브쿼리란 하나의 SQL문안에 포함되어 있는 또 다른 SQL문을 말합니다. 서브쿼리는 알려지지 않은 기준을 이용한 검색을 위해 사용하며, 메인쿼리가 서브쿼리를 포함하는 종속적인 관계입니다.

     

     SCOTT의 부서명을 검색하기 위해서는 SCOTT의 부서번호를 검색하는 쿼리와 부서번호로 부서명을 검색하는 쿼리가 필요합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1_1) SCOTT의 부서번호를 검색하는 쿼리문
    SELECT DEPTNO
      FROM EMP 
     WHERE ENAME = 'SCOTT';
     
    1_2) 부서번호로 부서명을 검색하는 쿼리문
    SELECT DNAME
      FROM DEPT 
     WHERE DEPTNO = 20
    cs

     

     부서번호을 검색하는 쿼리문 부서명을 검색하는 쿼리문으로 SCOTT에 부서명을 검색할 수 있지만, 서브쿼리를 사용하면 한 번에 쿼리문으로 부서명을 검색할 수 있습니다.


    1_3) 서브쿼리를 사용하여 부서명을 검색하는 쿼리문

    1
    2
    3
    4
    5
    6
    1_3) 서브쿼리를 사용하여 부서명을 검색하는 쿼리문
    SELECT DNAME
      FROM DEPT 
     WHERE DEPTNO = ( SELECT DEPTNO
                          FROM EMP 
                       WHERE ENAME = 'SCOTT' );
    cs

       

     서브쿼리를 사용하여 부서명을 검색하는 쿼리문을 보면 메인쿼리와 서브쿼리 두 개의 SELECT 문으로 구성되고, 서브쿼리의 SELECT문은 시작과 끝을 소괄호로 묶어 주어야 합니다. 이러한 서브쿼리는 하나의 쿼리문의 결과를 메인쿼리에 전달하기 위해서 사용합니다.


    서브쿼리를 사용할 때 주의사항

    1.서브쿼리를 괄호로 감써서 사용해야 합니다.

    2.서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산좌와 함께 사용 가능합니다.

    단일 행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하이어야 하고 복수 행 비교 연산자는 서브쿼리의 결과 건수와 상관 없습니다.

    3.서브쿼리에서는 ORDER BY를 사용할 수 없습니다. ORDER BY절은 SELECT절에서 오직 한 개만 올 수 있기 때문에 ORDER BY절은 메인쿼리의 마지막 문장에 위치해야 합니다.


    서브쿼리가 SQL문에서 사용이 가능한 곳

    1.SELECT 절

    2.FROM 절

    3.WHERE 절

    4.HAVING 절

    5.ORDER BY 절

    6.INSERT문의 VALUES 절

    7.UPDATE문의 SET 절


    단일 행 서브쿼리

     서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하이어야 합니다. 

    만약, 서브쿼리의 결과 건수가 2건 이상을 반환하면 SQL문은 실행시간(Run Time) 오류가 발생합니다.


    다중 행 서브쿼리

     서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다. 

     

    다중 행 비교 연산자

    IN - 서브쿼리의 결과에 존재하는 임의이 값과 동일한 조건을 의미합니다.

    ALL - 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미합니다.

    ANY, SOME - 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미합니다.

    EXISTS - 서브쿼리의 결과에 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미합니다.


    IN 연산자

     IN 연산자는 메인쿼리의 비교 조건에서 서브쿼리의 출력 결과와 하나라도 일치하면 메인쿼리의 WHERE 절이 참이 되도록하는 연산자입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- SCOTT와 같은 부서에 있는 사원 정보
    SELECT *
      FROM EMP 
     WHERE DEPTNO IN ( SELECT DEPTNO
                         FROM EMP
                        WHERE ENAME = 'SCOTT' );      
                        
    -- SCOTT와 같은 부서에 있는 사원 중 SMITH를 제외한 사원 정보
    SELECT *
      FROM EMP 
     WHERE DEPTNO IN ( SELECT DEPTNO
                         FROM EMP
                        WHERE ENAME = 'SCOTT' )
       AND ENAME != 'SMITH'
    cs

      

    ALL 연산자

     ALL 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과값과 모두 일치하면 참이 되도록하는 연산자압니다. 

    1
    2
    3
    4
    5
    6
    -- 부서번호가 30번인 사원들 중에서 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원 정보
    SELECT *
      FROM EMP 
     WHERE SAL > ALL ( SELECT SAL
                         FROM EMP
                        WHERE DEPTNO = 30);
    cs

    ANY 연산자

     메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참이 되도록하는 연산자입니다.

    1
    2
    3
    4
    5
    6
    -- 부서번호가 30번인 사원들 중에서 급여를 가장 적게 받는 사원보다 더 많은 급여를 받는 사원 정보
    SELECT *
      FROM EMP 
     WHERE SAL > ANY ( SELECT SAL
                         FROM EMP
                        WHERE DEPTNO = 30); 
    cs


    반응형

    댓글

Designed by Tistory.