서브쿼리란?
쿼리 안에 있는 쿼리이다.
쿼리보다 먼저 실행되며, 실제로 여러 번 쿼리를 수행한다.
서브쿼리에 서브쿼리가 있는 경우 가장 안쪽의 서브쿼리부터 실행한다.
계산 필드로 서브쿼리를 사용할 시, row의 수 만큼 서브쿼리가 실행된다.
정리.
서브쿼리는 WHERE 절과 IN 절에서 자주 사용되며, 계산 필드를 구하기 위해서도 종종 사용된다.
그러나, 성능을 고려하여 이후에 살펴볼 join과 같은 다른 방법을 고려하는 것이 좋다.
도전 과제
서브 쿼리를 사용하여 10 이상의 가격으로 제품을 구매한 고객 목록을 반환하라.
SELECT *
FROM customers c
WHERE c.cust_id IN (
SELECT cust_id
FROM orders o
WHERE o.order_num IN (
SELECT order_num
FROM orderItems oi
WHERE item_price >= 10)
);
BR01 제품이 주문된 날짜와 고객 ID를 서브쿼리를 이용하여 주문 날짜 순으로 반환하라.
SELECT cust_id, order_date FROM orders WHERE order_num IN (
SELECT order_num
FROM orderitems o
WHERE prod_id = 'BR01'
)
ORDER BY order_date;
BR01을 구매한 고객의 이메일 주소를 반환하라.
SELECT cust_email FROM customers c WHERE cust_id IN (
SELECT cust_id FROM orders WHERE order_num IN (
SELECT order_num FROM orderitems o WHERE prod_id = 'BR01')
)
고객 ID 목록과 고객별로 주문한 수량을 적은 순서대로 출력하라.
SELECT cust_id,
(SELECT sum(quantity)
FROM orderitems o2
WHERE o2.order_num = o.order_num
GROUP BY order_num) total_ordered // GROUP BY 는 불필요
FROM orders o
ORDER BY 2;
Products 테이블에서 모든 제품명과 판매된 항목의 총수량을 반환하라.
SELECT prod_name,
(SELECT sum(quantity)
FROM orderitems o
WHERE o.prod_id = p.prod_id
GROUP BY p.prod_id) quant_sold // GROUP BY 는 불필요
FROM products p ;
도전 과제 풀이 중 틀린점
4번, 5번의 서브 쿼리의 경우 order_num, prod_id 가 특정 값일 때의 sum 값을 가져오는데, 각 서브 쿼리는 해당 row 값에 맞는 하나의 값만 반환하므로 GROUP BY 절은 불필요하다.