[12일차][SQL]Subquery 서브쿼리

김준석·2023년 12월 26일

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

결과물 : 주방용품을 담당하는 영희, 스포츠를 담당하는 철수의 클릭 이력을 추출.

  • 예제 실무 활용법
    • INNER JOIN을 하기전 필터링을 해줌으로써 리소스를 감소하는 코드를 작성할 수 있다. 성능에 이점을 가져옴.

예제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)

0개의 댓글