SQL CTE

SQL 쿼리문을 작성하면서 뭔가 복잡하고 지저분해보여 더 깔끔하고 효율적으로 짤 방법이 없는 지 고민한 적이 많으실 거에요.

저 또한 그런 고민이 많다가 이번에 CTE 라는 기능에 대해 알게 되었습니다!

같이 CTE가 무엇이고 어떻게 사용하는 것인지 알아봅시다.

 


1. CTE (Common Table Expression)

CTE란? Common Table Expression의 약자로 말 그대로 공통 테이블 표현식입니다.

복잡한 쿼리 가독성 좋고, 재사용 가능한 형태로 구조화할 때 유요한 기능이에요.

 

CTE쿼리 실행 중에만 일시적으로 존재해요.

DB에 테이블을 저장하는 방식이 아닙니다.

 

또한 한번 선언하면, 하나의 쿼리 내에서 여러번 참조가 가능해요.

복잡한 서브쿼리를 위로 올려서 쿼리를 깔끔하게 구성할 수 있습니다.

 


2. CTE 사용방법

그럼 CTE는 어떻게 사용할까요?
CTESELECT, INSERT, UPDATE, DELETE 문 앞에 선언해서, 임시로 이름 붙인 결과셋(=가상의 테이블)을 만드는 구문이에요.

일시적인 (View) 처럼 동작한다고 생각하시면 됩니다.

 

CTE 설정 기본 문법은 다음과 같습니다.

WITH cte_name AS (
    SELECT 컬럼들
    FROM 테이블
    WHERE 조건
)
SELECT *
FROM cte_name
WHERE ...

 

WITH 을 사용해 WITH cte_name AS (...)으로 CTE를 설정하고 똑같이 테이블처럼 사용하면 됩니다.

이렇게 생성한 CTE 테이블은 해당 쿼리 실행 범위 내에서만 유효하며, 메모리에 일시적으로 존재해요.

 

예시

WITH high_salary AS (
    SELECT emp_id, emp_name, salary
    FROM employees
    WHERE salary > 5000
)
SELECT emp_name
FROM high_salary
WHERE emp_name LIKE 'J%';

위 코드처럼 salay > 5000인 직원들을 high_salary라는 CTE로 묶고, 그 중 이름이 J로 시작하는 사람만 최종적으로 조회합니다.

 

CTE를 여러번 설정할 수 도 있어요!

WITH dept_avg AS (
    SELECT dept_id, AVG(salary) AS avg_sal
    FROM employees
    GROUP BY dept_id
),
high_salary AS (
    SELECT emp_id, emp_name, dept_id
    FROM employees
    WHERE salary > 8000
)
SELECT e.emp_name, d.avg_sal
FROM high_salary e
JOIN dept_avg d ON e.dept_id = d.dept_id;

이처럼 dept_avghigh_salary 라는 두 개의 임시 테이블을 만들어서 서로 조인할 수 있어요.

 


3. 재귀(Recursive) CTE

CTE 재귀 쿼리 또한 가능합니다.

트리 구조를 처리할 때 자주 사용해요.

 

WITH RECURSIVE emp_hierarchy AS (
    -- 1단계: 상위 관리자
    SELECT emp_id, emp_name, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL
    
    UNION ALL
    
    -- 2단계 이후: 하위 직원들
    SELECT e.emp_id, e.emp_name, e.manager_id, h.level + 1
    FROM employees e
    JOIN emp_hierarchy h ON e.manager_id = h.emp_id
)
SELECT *
FROM emp_hierarchy;

WITH RECURSIVE를 붙이면 CTE 안에서 자기 자신을 참조할 수 있어요.

이런 방식으로 트리 또는 계층 데이터를 탐색합니다.

 


4. 정리하며..

지금까지 SQLCTE에 대해 알아보았습니다.

CTE를 활용하면 쿼리의 가독성 재사용성을 향상 시킬 수 있을 것으로 기대됩니다.

CTE를 사용할 때, 같은 CTE를 여러 번 참조하면, 실제로는 CTE 결과를 재사용하지 않고 매번 다시 읽습니다. 메모리 및 비용을 고려하셔서 CTE를 사용하셔야 할 것 같아요!

'DB > DBMS' 카테고리의 다른 글

A 테이블 - B 테이블 쿼리  (1) 2024.11.20
MySQL vs PostgreSQL  (0) 2024.10.30
PostgreSQL  (4) 2024.10.25
SQL의 여러 종류의 키(Key)  (1) 2024.09.06
사용자 계정 생성 및 삭제  (2) 2023.11.20