SQL - WITH절 vs. FROM절 Subquery

Ryan·2025년 1월 16일

SQL/Python 분석

목록 보기
65/94

1. FROM 절 Subquery

1) 기본 개념

  • 보통 SQL에서 FROM table_name 위치에 하위 쿼리(SELECT ...)를 넣어,그 결과를 임시 테이블처럼 사용하는 기법입니다.
  • 이런 방식을 통해, 필요한 컬럼만 미리 집계/가공한 뒤 최종 쿼리에서 재활용함으로써 연산량을 줄일 수 있습니다.
sql
코드 복사
SELECT Col3,
       SUM(Col4) AS sum_col4
FROM (
    SELECT Col1, Col2, Col3, AVG(Col4) AS Col4
    FROM ORIGINAL_TABLE
    WHERE Col1 = 'Y'
    GROUP BY 1, 2, 3
) Sub
GROUP BY 1;
  • 위 예시는 ORIGINAL_TABLE에서 미리 필요한 컬럼(Col1, Col2, Col3, Col4)을 요약(AVG(Col4))한 뒤,그 결과를 Sub라는 임시 이름으로 둔 다음, 다시 SELECT ... FROM (Subquery) Sub 형태로 집계(SUM(Col4))를 수행.

2) 장점

  1. 불필요한 컬럼 제외
    • 원본 테이블에 수많은 컬럼이 있을 때, 미리 필요한 컬럼만 SELECT해서 사이즈를 줄임.
  2. 중간 연산 결과 재활용
    • GROUP BY, JOIN 등 여러 단계의 로직을 나눠서 쿼리를 짜면 가독성이 좋아짐.
  3. 복잡한 로직 단계 구분
    • 한 번에 다 처리하기 어려운 로직을 Subquery(서브쿼리)로 먼저 가공하고, 최종 단계에서 깔끔하게 마무리.

3) 주의사항

  • DB 엔진에 따라 서브쿼리 최적화가 제대로 안 되면 성능이 저하될 수도 있음.
  • 너무 깊은 중첩(Subquery in Subquery in Subquery...)은 가독성과 성능 모두 불리할 수 있으니,필요하다면 공통 테이블 표현식(CTE, WITH 절)을 고려하는 것도 방법.

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

1) 기본 개념

  • WITH 임시테이블명 AS ( ... ) 구문을 통해, 쿼리 내에서만 사용할 임시 테이블을 만든 뒤,이 임시 테이블을 여러 번 조합하거나 재활용할 수 있는 방식.
  • 아래처럼 정의:
sql
코드 복사
WITH [TEMP_TABLE_NAME] AS (
    SELECT ...
    FROM Table
    ...
)
SELECT ...
FROM [TEMP_TABLE_NAME];

2) 예시: 여러 쿼리에 활용

sql
코드 복사
WITH TEMP_TABLE AS (
    SELECT Col1, Col2, Col3
    FROM TableX
    WHERE ...
    GROUP BY ...
)
-- 임시 테이블을 활용해 다른 쿼리를 수행
SELECT A.*, T.Col3
FROM TEMP_TABLE T
LEFT JOIN TableA A
   ON T.Col1 = A.ColX;

-- 또 다른 쿼리 예시: UNION ALL
SELECT Col1, Col2, Col3
FROM TEMP_TABLE
UNION ALL
SELECT Col1, Col2, Col3
FROM TableA;
  • 하나의 WITH로 만들어진 TEMP_TABLE동일 쿼리 안에서 여러 번 사용할 수 있음.
  • JOIN, UNION, WHERE 조건 등에 자유롭게 활용 가능.

3) 장점

  1. 가독성
    • 복잡한 로직을 단계별로 나눠서 명확히 표현.
    • Subquery를 중첩하기보다는 WITH 절로 분리하면 쿼리가 좀 더 깔끔해짐.
  2. 성능(일부 경우)
    • 일부 DB 엔진에서는 CTE(공통 테이블 표현식)가 한 번 계산된 뒤 여러 번 재사용될 수 있음.
    • 하지만 DB마다 최적화 방식이 다르므로, 무조건 성능이 좋아진다고 말하기는 어려움.

4) 주의사항

  • 메모리 사용량
    • CTE는 임시 테이블을 메모리에 생성하기 때문에, 데이터가 매우 큰 경우 리소스 부담이 생길 수 있음.
  • DBMS별 차이
    • Oracle, PostgreSQL, SQL Server 등에서는 WITH 절(CTE)을 폭넓게 지원.
    • MySQL의 일부 버전(8.0 이전)은 CTE가 제한적. MySQL 8.0 이상에서 지원.

3. Subquery vs. WITH 절 비교

구분FROM 절 SubqueryWITH 절(CTE)
구조FROM (SELECT ...) AS SubWITH TEMP AS (SELECT ...) SELECT ...
가독성Subquery가 중첩될수록 복잡해질 수 있음단계별 명시 가능 (한번 정의 후 여러번 사용)
재사용성서브쿼리는 한 번만 사용 (중첩하더라도 재활용은 제한적)WITH로 정의된 임시테이블 여러 번 사용 가능
메모리/리소스일반적으로 쿼리 옵티마이저에 의해 처리임시테이블 생성 → 데이터가 크면 리소스 부담
DB 호환성대부분의 SQL DB가 서브쿼리 지원Oracle, PostgreSQL, SQL Server, MySQL8+ 등에서 주로 사용

4. 어떤 상황에서 쓰면 좋을까?

  1. FROM 절 Subquery
    • 단순히 “원본 테이블에서 필요한 컬럼이나 집계만 골라내고, 최종 쿼리에서 추가 작업” 할 때
    • 여러 단계 중첩은 지양(가독성 저하)
  2. WITH 절(CTE)
    • 중간 단계(임시 테이블)을 명시적으로 만들어서,
    • JOIN, UNION, WHERE 등 다양한 후속 쿼리에서 재활용해야 할 때
    • 복잡 로직을 여러 단계로 나눌 때 쿼리를 깔끔하게 관리 가능

5. 결론

  • FROM 절 SubqueryWITH 절(CTE) 모두, 중간 집계나 필터링을 미리 수행해 최종 쿼리를 단순화하려는 목적으로 사용합니다.
  • 작은 규모나 한 번만 필요한 경우라면 Subquery만으로도 충분할 때가 많고,
  • 로직이 복잡해지고 동일한 중간 계산을 여러 번 사용해야 한다면 WITH 절(임시 테이블)이 더 나은 선택일 수 있습니다.
  • 최종적으로는 가독성, 성능, 유지보수성을 모두 고려해 적절한 방법을 선택하는 것이 핵심입니다.

0개의 댓글