MSSQL WITH 사용 방법 (쿼리 분리)

SQL Server에서 WITH 명령어는 Common Table Expressions (CTE)를 정의하는 데 사용됩니다. CTE란 복잡한 쿼리를 단순화하거나 쿼리 내에서 여러 번 재사용하기 위해 사용하는 일시적인 결과 세트를 의미합니다. CTE를 사용하면 복잡한 쿼리를 분리해서 쿼리를 가독성 있게 짤 수 있는 장점이 있습니다.

WITH

사용 구문

WITH CTE_Name (Column1, Column2, Column3, ...)
AS (
    -- CTE 정의, 여기에 SELECT 문을 사용하여 데이터를 추출합니다.
        SELECT Column1, Column2, Column3, ...
    FROM SomeTable
    WHERE SomeCondition
)
-- 이후 CTE_Name을 참조하여 쿼리를 작성합니다.
SELECT * FROM CTE_Name;

 

CTE는 주로 재귀 쿼리, 계층적 데이터 쿼리, 중복 로직의 제거 등 다양한 상황에서 사용됩니다. CTE는 쿼리 실행 시점에만 존재하며, 쿼리 실행이 종료되면 사라집니다.

 

예시 1)

employees 테이블

 

Employees 테이블에서 Salary가 50000 이상인 직원의 이름과 급여를 조회하는 쿼리를 WITH 명령어를 사용하면 다음과 같이 할 수 있습니다.

WITH HighSalaryEmployees (Name, Salary) -- Name, Salary는 별칭입니다.
AS (
    SELECT EmployeeName, Salary
    FROM Employees
    WHERE Salary >= 50000
)
SELECT * FROM HighSalaryEmployees;

 

with 사용 조회 결과

 

물론 이런 간단한 쿼리는 WITH를 쓰는 것보다 오히려 그냥 아래와 같이 조회하는 게 간결하다고 생각하실 수 있습니다. 

SELECT EmployeeName, Salary
FROM Employees
WHERE Salary >= 50000;

 

하지만 쿼리가 복잡해질수록 WITH 구문을 사용해서 여러 단계로 나누어 작성하면 가독성이 향상되고 디버깅도 용이해집니다.

 

예시 2)

주문 데이터를 나타내는 orders 테이블에서 2023년 2월에 각 사용자가 총 얼마를 주문했는지를 조회하면 아래와 같습니다.

WITH FebruaryOrders AS (
    SELECT 
        customer_id, 
        SUM(amount) AS total_amount
    FROM orders
    WHERE MONTH(order_date) = 2 AND YEAR(order_date) = 2023
    GROUP BY customer_id
)
SELECT * FROM FebruaryOrders;
반응형

댓글

Designed by JB FACTORY