반응형
한번 다듬어진 데이터를 다시 사용해야 할 때 (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 뒤에 서브쿼리를 잘 쓰이지 않는다
반응형
'Skills > SQL' 카테고리의 다른 글
[SQL] 17. SQL 에러 대처하기 (0) | 2021.08.06 |
---|---|
[SQL] 16. 다듬어진 데이터가 필요로 할 때, WITH (0) | 2021.08.06 |
[SQL] 14. IF와 같은 역할, CASE WHEN (0) | 2021.08.05 |
[SQL] 13. 날짜와 시간 다루기 (DATE) (0) | 2021.08.05 |
[SQL] 12. 테이블 세로로 연결하기 (UNION) (0) | 2021.08.05 |