🍋 ⚾️ 💻 🎬 🎮

Tech/SQL

[SQL] WITH AS (Common Table Expression, CTE)

aeightchill 2025. 2. 8. 13:36
728x90

WITH AS

WITH AS 구문은 공통 테이블 표현식 (CTE, Common Table Expression) 을 정의하는 데 사용한다.

→  임시적인 결과 집합을 생성하여 복잡한 쿼리를 더 읽기 쉽게 만들고, 재사용할 수 있다.


기본

WITH cte_name AS (
    -- 서브쿼리 (임시 테이블)
    SELECT column1, column2
    FROM table_name
    WHERE condition
)
SELECT * FROM cte_name;
  • WITH 키워드 다음에 cte_name을 정의한다.
  • AS (...) 부분에는 실제로 실행될 서브쿼리를 작성한다.
  • 이후 SELECT 문에서 cte_name을 테이블처럼 사용한다.

예제 1: CTE 사용

employees 테이블에서 연봉이 5000 이상인 직원 목록 가져오기.

WITH high_salary_employees AS ( --high_salary_employees는 일종의 임시 테이블처럼 작동하여 이후 SELECT 문에서 사용
    SELECT id, name, salary
    FROM employees
    WHERE salary >= 5000
)
SELECT * FROM high_salary_employees;

 


예제 2: CTE 여러 개 사용

WITH
    high_salary AS (
        SELECT id, name, salary FROM employees WHERE salary >= 5000
    ),
    low_salary AS (
        SELECT id, name, salary FROM employees WHERE salary < 5000
    )
SELECT * FROM high_salary
UNION ALL
SELECT * FROM low_salary;

 


예제 3: 재귀 CTE 사용 (Recursive CTE)

manager_id를 기준으로 계층 구조를 분석하기.

WITH RECURSIVE employee_hierarchy AS ( -- RECURSIVE 키워드를 사용하면 자기 자신을 참조하는 방식으로 쿼리를 실행
    -- 기초 단계 (Anchor Member)
    SELECT id, name, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL  -- 최상위 관리자 (CEO)

    UNION ALL

    -- 재귀 단계 (Recursive Member)
    SELECT e.id, e.name, e.manager_id, eh.level + 1
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

 

 


CTE vs. 서브쿼리 vs. 임시 테이블

구분 특징
CTE (WITH AS) 코드 가독성이 좋고, 여러 번 재사용 가능
서브쿼리 한 번만 사용되며 가독성이 낮음
임시 테이블 (TEMP TABLE) 여러 번 사용 가능하지만 생성 및 삭제가 필요

 

 

 

 

 

728x90

'Tech > SQL' 카테고리의 다른 글

[SQL] DATE_FORMAT (MySQL)  (0) 2025.04.06
[SQL] JOIN(조인)  (0) 2025.02.10
[SQL] COALESCE  (0) 2025.02.08
[SQL] ROUND, CEIL, FLOOR (반올림, 올림, 내림)  (0) 2025.02.08
[SQL] CASE WHEN  (0) 2025.02.08