FROM절 서브쿼리와 WITH절 공통테이블 표현식

SeongGyun Hong·2025년 2월 28일

SQL

목록 보기
45/51

https://school.programmers.co.kr/learn/courses/30/lessons/299310

FROM 절 서브쿼리 vs WITH 절 공통테이블 표현식 (CTE)

SQL 쿼리를 작성할 때 복잡한 로직을 깔끔하게 표현하고 관리하기 위해 FROM 절 서브쿼리WITH 절 공통테이블 표현식(CTE)를 자주 사용하는데, 어떤 경우에 어떤 쿼리를 쓰면 좋을지에 대해 이번 기회에 정리하고자 한다.


1. FROM 절 서브쿼리란?

FROM 절 서브쿼리는 메인 쿼리 내에서 인라인 뷰(임시 테이블) 형태로 사용되는 서브쿼리를 말한다.

  • 특징:
    • 한 번만 사용 가능
    • 서브쿼리를 메인 쿼리와 함께 작성하여 바로 JOIN 또는 다른 연산에 활용
    • 단순한 경우 가독성이 좋을 수 있으나, 복잡해지면 코드 관리가 어려울 수 있음

2. WITH 절 공통테이블 표현식 (CTE)이란?

CTE(Common Table Expression)WITH 절을 사용하여 쿼리의 시작 부분에서 임시 테이블(논리적 뷰)을 정의하고, 이후 메인 쿼리에서 재사용할 수 있는 기능이다.

  • 특징:
    • 복잡한 쿼리를 논리적인 단위로 분리하여 가독성 향상
    • 동일한 결과 집합을 여러 번 재사용할 수 있음
    • 재귀 쿼리 등 복잡한 로직 구현에 유용

3. FROM 절 서브쿼리와 CTE의 비교

두 방법은 기본적으로 동일한 결과를 도출할 수 있지만, 사용 목적과 상황에 따라 차이가 있다.

구분FROM 절 서브쿼리WITH 절 CTE
사용 방식FROM (SELECT ...) AS ALIASWITH CTE_NAME AS (...) 후 메인 쿼리에서 사용
재사용 가능성한 번만 사용 가능여러 번 재사용 가능
가독성단순 쿼리에서는 문제 없음복잡한 쿼리를 여러 단계로 나누기 용이
SQL 엔진 최적화인라인 뷰로 처리, 경우에 따라 다름내부적으로 최적화 가능(다만 DBMS에 따라 차이 있음)
재귀 쿼리 지원지원하지 않음재귀 쿼리 작성에 적합

4. 언제 무엇을 사용해야 하는가?

  • FROM 절 서브쿼리

    • 단순한 쿼리나 한 번만 사용할 임시 결과 집합이 필요한 경우
    • 서브쿼리 내부의 결과를 바로 JOIN하여 사용할 때
  • WITH 절 CTE

    • 동일한 임시 결과를 여러 번 사용해야 하는 경우
    • 복잡한 쿼리를 여러 단계로 분리해 가독성을 높이고 싶을 때
    • 재귀 쿼리와 같이 복잡한 로직을 구현할 때

5. 성능 및 최적화 고려사항

  • 쿼리 복잡도와 SQL 엔진:
    • DBMS에 따라 CTE와 서브쿼리의 내부 처리 방식이 다를 수 있으므로, 실제 데이터와 환경에서 성능 테스트를 진행하는 것이 좋다.

      SQL 엔진은 쿼리를 실행하기 전에 실행 계획을 수립하는데, 이 과정에서 CTE와 서브쿼리의 처리 방식에 차이가 있을 수 있다.
      예를 들어, 일부 DBMS에서는 CTE를 한 번 계산해 결과를 재사용하는 materialization 전략을 사용할 수 있지만, 다른 DBMS에서는 CTE를 인라인 뷰처럼 본문 쿼리에 병합하여 매번 계산할 수도 있음.
      반면, FROM 절의 서브쿼리는 일반적으로 인라인 뷰로 처리되어 메인 쿼리와 통합된 실행 계획을 갖게 됨.
      따라서 동일한 로직이라 하더라도 데이터 양, 인덱스 구성, DBMS의 버전 및 설정에 따라 성능 차이가 발생할 수 있으므로, 실제 운영 환경이나 테스트 데이터를 바탕으로 벤치마크 테스트를 진행하는 것이 매우 중요함.
      즉, 해보고 결정해라!


결론

FROM 절 서브쿼리와 WITH 절 CTE는 모두 잘 쓸줄 알아야 한다.

  • 단순한 한 번의 사용에는 FROM 절 서브쿼리가 간단할 수 있고,
  • 복잡한 로직의 분리 및 재사용에는 CTE가 가독성과 유지보수 측면에서 유리하다.

다만, 각 DBMS마다 내부 최적화 방식이 다르기에, 상황에 맞게 적절한 방법을 선택하고, 인덱스 및 쿼리 최적화 기법을 함께 적용할 수 있으면 더욱 효율적인 쿼리 작성이 가능할 것이다.

profile
헤매는 만큼 자기 땅이다.

0개의 댓글