인라인 뷰

    FROM 절에 사용하는 서브 쿼리를 인라인 뷰InlineView 라고 한다. 원래 FROM 절에는 테이블이나 뷰가 오는데, 서브 쿼리를 FROM 절에 사용해 하나의 테이블이나 뷰처럼 사용할 수 있다. 뷰를 해체하면 하나의 독립적인 SELECT문이므로 FROM 절에 사용하는 서브 쿼리도 하나의 뷰로 볼 수 있어서 인라인 뷰라는 이름이 붙은 것이다.

    입력

        SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
          FROM employees a,
               departments b,
               ( SELECT AVG(c.salary) AS avg_salary
                   FROM departments b,
                        employees c
                  WHERE b.parent_id = 90  -- 기획부
                    AND b.department_id = c.department_id ) d
         WHERE a.department_id = b.department_id
           AND a.salary > d.avg_salary;
    

    결과

        EMPLOYEE_ID EMP_NAME            DEPARTMENT_ID DEPARTMENT_NAME
        ----------- ------------------- ------------- -----------------
        201         Michael Hartstein   20            마케팅
        114         Den Raphaely        30            구매/생산부
        121         Adam Fripp          50            배송부
        120         Matthew Weiss       50            배송부
        103         Alexander Hunold    60            IT
        204         Hermann Baer        70            홍보부
        177         Jack Livingston     80            영업부
        176         Jonathon Taylor     80            영업부
        175         Alyssa Hutton       80            영업부
        174         Ellen Abel          80            영업부
        170         Tayler Fox          80            영업부
    
        36개의 행이 선택됨
    

    위 쿼리는 기획부(90) 산하에 있는 부서에 속한 사원의 평균급여보다 많은 급여를 받는 사원 목록을 추출한 것인데, 기획부 산하 평균급여를 구하는 부분을 서브 쿼리로 작성했고 이를 FROM 절에 위치시켰다. 또 다른 예를 살펴 보자.

    입력

        SELECT a.*
          FROM ( SELECT a.sales_month, ROUND(AVG(a.amount_sold)) AS month_avg
                   FROM sales a,
                        customers b,
                        countries c
                  WHERE a.sales_month BETWEEN '200001' AND '200012'
                    AND a.cust_id = b.CUST_ID
                    AND b.COUNTRY_ID = c.COUNTRY_ID
                    AND c.COUNTRY_NAME = 'Italy' -- 이탈리아
                  GROUP BY a.sales_month
               )  a,
               ( SELECT ROUND(AVG(a.amount_sold)) AS year_avg
                   FROM sales a,
                        customers b,
                        countries c
                  WHERE a.sales_month BETWEEN '200001' AND '200012'
                    AND a.cust_id = b.CUST_ID
                    AND b.COUNTRY_ID = c.COUNTRY_ID
                    AND c.COUNTRY_NAME = 'Italy' -- 이탈리아
               ) b
         WHERE a.month_avg > b.year_avg ;
    

    결과

        SALES_MONTH  MONTH_AVG
        ------------ ----------
        200002       137
        200007       122
        200009       110
        200012       184
    
        4개의 행이 선택됨.
    

    이 쿼리는 좀 복잡한데, 두 개의 서브 쿼리를 FROM 절에 위치시켰다. 쿼리의 내용은 2000년 이탈리아 평균 매출액(연평균)보다 큰 월의 평균 매출액을 구한 것이다. 즉 첫 번째 서브 쿼리에서는 월별 평균 매출액을, 두 번째 서브 쿼리에서는 연평균 매출액을 구해서, ‘월 평균매출액 >연평균 매출액’ 조건을 만족하는 월의 평균매출액을 구한 것이다.

    지금까지 조인과 서브 쿼리에 대해 알아보았다. 기본 개념을 이해한다면 원하는 목적에 맞게 다양한 형태로 쿼리를 작성할 수 있을 것이다. 조인이나 서브 쿼리는 개별 단위로 구분해 보면 그리 복잡하지 않으니, 복잡한 SQL문을 작성하게 되더라도 차근차근 작성한다면 큰 어려움 없이 작성할 수 있다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.