기본 패턴
text
WITH recent_posts AS (
SELECT id, user_id, title
FROM posts
WHERE created_at >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT user_id, COUNT(*)
FROM recent_posts
GROUP BY user_id;설명
WITH는 쿼리 앞에 임시 이름을 붙인 결과 집합을 정의하고, 이어지는 본문 쿼리에서 그 이름을 테이블처럼 사용할 수 있게 해 줍니다.- 이런 이름 붙은 임시 결과를 CTE(Common Table Expression)라고 부릅니다.
- CTE의 가장 큰 장점은 복잡한 쿼리를 단계별로 읽을 수 있게 만든다는 점입니다.
- 여러 번 반복되는 서브쿼리를 이름으로 뽑아내면 의도가 선명해지고, 검토와 수정도 쉬워집니다.
- 처음에는 "복잡한 서브쿼리를 읽기 좋게 나누는 문법"으로 이해하면 충분합니다.
짧은 예제
text
WITH active_users AS (
SELECT id, name
FROM users
WHERE active = true
)
SELECT p.title, u.name
FROM posts AS p
JOIN active_users AS u ON u.id = p.user_id;빠른 정리
| 요소 | 역할 |
|---|---|
WITH name AS (...) | 임시 결과에 이름 붙이기 |
| CTE 이름 | 뒤쪽 쿼리에서 테이블처럼 사용 |
| 장점 | 복잡한 쿼리를 단계별로 분리 |
| 적합한 상황 | 긴 서브쿼리를 읽기 좋게 정리할 때 |
주의할 점
CTE는 항상 "성능 최적화용 문법"이라기보다, 우선은 읽기 좋은 구조를 만드는 문법에 가깝습니다. 먼저 의도를 분명히 쓰고, 성능이 중요해질 때 실행 계획을 함께 확인하는 편이 좋습니다.
참고 링크
1 sources