SQL을 어느 정도 쓰다 보면 자연스럽게 부딪히는 개념이 바로 서브쿼리(Subquery)와 CTE(Common Table Expressions)다. 둘 다 쿼리 안에 또 다른 쿼리를 포함하는 방식인데, 언제 서브쿼리를 쓰고 언제 CTE를 써야 하는지 헷갈리는 경우가 많다. 이 글에서 둘의 차이, 장단점, 그리고 실무에서 어떻게 활용하는지를 정리해본다.
서브쿼리란?
서브쿼리는 다른 쿼리 안에 중첩되어 있는 SELECT 문이다. 일반적으로 WHERE, FROM, SELECT 절 내부에 사용된다.
예시 (SELECT 절 내부):
SELECT name,
(SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count
FROM users;
예시 (FROM 절 내부):
SELECT sub.name, sub.total
FROM (
SELECT name, SUM(amount) AS total
FROM orders
GROUP BY name
) AS sub;
CTE란?
CTE(Common Table Expression)는 쿼리 블록에 이름을 붙여 재사용 가능한 일시적 테이블처럼 사용하는 방식이다. WITH 키워드로 시작한다.
예시:
WITH order_summary AS (
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
)
SELECT u.name, o.order_count
FROM users u
JOIN order_summary o ON u.id = o.user_id;
차이점 요약
항목 서브쿼리 CTE
선언 위치 | 쿼리 내부 어디든 가능 | WITH 절 상단에 선언 |
가독성 | 복잡해질수록 떨어짐 | 구조적이고 깔끔함 |
재사용 | 불가 (같은 쿼리 반복 필요) | 가능 (한 번 정의 후 여러 번 사용) |
디버깅 | 상대적으로 어려움 | 블록 단위로 디버깅 용이 |
재귀 쿼리 | 어려움 | 재귀 구조 지원 (예: 트리 구조 탐색) |
언제 서브쿼리? 언제 CTE?
- 서브쿼리 추천 상황: 간단한 로직, 단일 조회, 빠르게 작성할 때
- CTE 추천 상황: 복잡한 쿼리, 재사용이 필요한 경우, 여러 단계로 쿼리 나눌 때, 재귀 쿼리 작성 시
마무리
서브쿼리와 CTE는 비슷해 보이지만, 복잡한 쿼리를 다루는 데 있어 가독성과 유지보수성 측면에서 큰 차이를 만든다. 특히 협업이나 장기 프로젝트에서는 CTE가 훨씬 유리한 경우가 많다. 둘 다 자유롭게 쓸 수 있을 때, 진짜 SQL 고수라고 할 수 있다.
[SQL 쿡북]
https://link.coupang.com/a/cp14TA
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
SQL 쿡북:모든 SQL 사용자를 위한 쿼리 완벽 가이드 - 프로그래밍 언어 | 쿠팡
쿠팡에서 SQL 쿡북:모든 SQL 사용자를 위한 쿼리 완벽 가이드 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 프로그래밍 언어 제품도 바로 쿠팡에서 확인할 수 있습니다.
www.coupang.com
'빅데이터 관련 자료 > [SQL] Basic' 카테고리의 다른 글
인덱스(Index)의 작동 원리와 성능 이슈 (1) | 2025.04.29 |
---|---|
SQL에서 DDL과 JOIN은 어떻게 다를까? (1) | 2025.04.28 |
PostgreSQL - 기본 문법, 날짜 처리, CRUD (2) | 2025.04.23 |
PostgreSQL의 스키마, 테이블, 컬럼 완전 쉽게 이해하기 (0) | 2025.04.09 |
PostgreSQL과 Athena에서 sequence와 generate_series 사용법 (0) | 2025.03.26 |