더북(TheBook)

인라인 뷰

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문을 작성하게 되더라도 차근차근 작성한다면 큰 어려움 없이 작성할 수 있다.

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