쿼리를 짜다 보면,
같은 로직을 반복해서 쓰거나,
쿼리 흐름을 나누고 싶을 때가 있습니다.
서브쿼리와 CTE(Common Table Expression)는 이럴 때 사용할 수 있는 선택지인데요.
둘 다 쓸 수 있지만,
용도와 상황에 따라 더 나은 선택이 달라집니다.
SELECT *
FROM (
SELECT user_id, COUNT(*) AS order_cnt
FROM orders
GROUP BY user_id
) AS sub
WHERE order_cnt >= 3;
WITH order_count AS (
SELECT user_id, COUNT(*) AS order_cnt
FROM orders
GROUP BY user_id
)
SELECT *
FROM order_count
WHERE order_cnt >= 3;
→ 결과는 같지만, 쿼리의 흐름은 다릅니다.
| 상황 | 추천 방식 |
|---|---|
| 한 번만 쓰고 끝나는 로직 | 서브쿼리로 충분 |
| 같은 쿼리를 여러 번 참조해야 함 | CTE가 더 명확 |
| 쿼리를 단계별로 나누고 싶음 | CTE로 가독성 ↑ |
| 성능 이슈가 민감한 환경 | CTE 반복 참조는 주의 필요 |
✔️ CTE는 깔끔한 구조와 재사용에 강점이 있지만, 모든 상황에서 더 나은 건 아닙니다.
✔️ 쿼리의 복잡도, 재사용 여부, 성능 조건을 보고 선택하세요.