PostgreSQL조회와 필터링

WITH와 CTE 기본

복잡한 쿼리를 여러 단계로 나눠 읽기 쉽게 만드는 WITH 절과 공통 테이블 식의 기본 사용법을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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