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