본문으로 바로가기
반응형
한번 다듬어진 데이터를 다시 사용해야 할 때 (feat. 쿼리 결과 재탕이 필요한 순간)
  • 서브쿼리
  • WITH

1. 서브쿼리를 WHERE에 쓰는 경우

가장 최근 주문일 데이터 골라보기
SELECT *
FROM data.orders
WHERE order_date = '2017-12-30'
  • 위 쿼리의 문제점
    • DB에 있는 가장 최근 일자를 데이터를 뽑을 때마다 확인
    • 매번 DB에서 최근 일자를 확인 후 WHERE 쿼리에 다시 수정

[해결방법]

STEP 1. 가장 최근 주문일 구하기 (서브쿼리)

SELECT MAX(order_date) AS max_order_date
FROM data.orders

STEP 2. 가장 최근 주문일 (STEP1에서 만든 결과)에 해당하는 데이터 필터링하기

SELECT *
FROM data.orders
WHERE order_date = (
	SELECT MAX(order_date) AS max_order_date
	FROM data.orders)

 

구매경험이 있는 고객 리스트만 구하고 싶을 때
  • JOIN과 달리 굳이 새로운 컬럼이 필요하지 않을 때 서브쿼리 사용

STEP 1. 주문 테이블에 있는 고객 리스트 구하기 (서브쿼리)

SELECT customer_id
FROM data.orders

STEP 2. 유저테이블에서 주문 테이블에 있는 고객 (STEP1에서 만든 결과) 필터링하기

SELECT *
FROM data.users
WHERE customer_id IN (SELECT customer_id FROM data.orders)

 

2. 서브쿼리를 FROM에 쓰는 경우

캘리포니아는 일평균 판매량이 얼마야?

STEP 1. 주(state)별로 일별 판매량 구하기 (서브쿼리)

SELECT o.*, u.state
FROM data.orders o
LEFT JOIN data.users u
ON o.customer_id = u.customer_id
SELECT u.state, o.order_date, SUM(o.quantity) AS daily_quantity
FROM data.orders o
LEFT JOIN data.users u
ON o.customer_id = u.customer_id
GROUP BY u.state, o.order_date
ORDER BY u.state, o.order_date

STEP 2. 주별 일별 판매량 (STEP1에서 만든 결과)의 평균 구하기

SELECT state, AVG(daily_quantity) AS state_daily_quantity
FROM (
	SELECT u.state, o.order_date, SUM(o.quantity) AS daily_quantity
	FROM data.orders o
	LEFT JOIN data.users u
	ON o.customer_id = u.customer_id
	GROUP BY u.state, o.order_date
	ORDER BY u.state, o.order_date
	)
GROUP BY state

 

서브쿼리를 포함한 쿼리를 작성할 때는 띄어쓰기를 해서 서브쿼리 구분을 용이하게 한다
  • ( ~~~ ) sub 와 같이 서브쿼리 뒤에 서브쿼리 이름을 적어줘도 된다
  • 들어갈 서브쿼리를 항상 먼저 따로 돌려보고 사용해야 한다
  • SELECT 뒤에 서브쿼리를 잘 쓰이지 않는다
반응형