Subquery
쿼리 내부에 사용되는 서브쿼리
잘못 이용시 리소스를 과다하게 사용할 수 있기 때문에 쿼리 최적화에 항상 신경을 써야됨.
예제1 비교문) 유저별 평균 구매 가격과 전체 평균 구매 가격을 비교해보자.
SELECT user_name, AVG(price) as avg_price, -- 유저별 평균 구매가격을 가져옴.
(SELECT AVG(price) -- 서브쿼리 시작
FROM orders o INNER JOIN products p
ON o.product_id = p.product_id) -- 서브쿼리 끝
as total_avg_price -- 서브쿼리 별칭. 전체 평균 구매가격을 만들어 줌.
FROM orders o INNER JOIN products p
ON o.product_id = p.product_id
GROUP BY 1
ORDER BY 2 DESC
결과물

예제2 JOIN 사용전 필터링) 스포츠/주방용품 매니저들의 클릭 이력을 가져오기
SELECT c.*
FROM
(SELECT name -- 서브쿼리 시작
FROM managers
WHERE managing in ('스포츠', '주방용품')) a -- 서브쿼리 끝.a 별칭을 줌.
INNER JOIN clicks c ON a.name = c.user_name
결과물 : 주방용품을 담당하는 영희, 스포츠를 담당하는 철수의 클릭 이력을 추출.

예제3 WHERE절에서 사용.) 가장 비싼 상품에 대한 클릭 이력 가져오기.
SELECT c.*
FROM clicks c
WHERE product_id = (SELECT product_id FROM products
ORDER BY price DESC LIMIT 1)
예제4 서브쿼리와 EXISTS를 같이 사용.) 매니저들 중에 상품을 구매한 사람이 있는 경우, 구매 테이블 전체를 출력하기.
- EXISTS
- IN연산자와 비슷
- 서브쿼리에서 IN연산자처럼 사용.
- 반환값은 TRUE or FALSE로 서브쿼리결과가 있어야(TRUE) 출력이 됨.
SELECT o.*
FROM orders o
WHERE EXISTS (SELECT user_name
FROM orders o INNER JOIN managers m ON o.user_name = m.name)