본문 바로가기
잡식

WITH CTE_TABLE을 이용한 쿼리문의 단순화

by 불멸도도 2024. 7. 31.

WITH CTE_TABLE 개요

WITH CTE_TABLE은 쿼리문을 단순화하고 가독성을 높이는 데 매우 유용한 SQL 구문입니다. CTE(Common Table Expressions)는 복잡한 쿼리를 임시 테이블 형태로 구성하여 재사용할 수 있게 합니다. 이는 특히 긴 쿼리나 중첩된 하위 쿼리를 사용할 때 큰 이점을 제공합니다.

 

CTE_TABLE의 장점

CTE_TABLE의 주요 장점은 다음과 같습니다:

  1. 가독성 향상: 복잡한 쿼리를 여러 단계로 나누어 작성할 수 있어 코드의 가독성을 크게 높여줍니다.
  2. 유지 보수 용이: 쿼리의 각 부분을 독립적으로 관리할 수 있어 수정과 유지 보수가 쉬워집니다.
  3. 재사용성 증가: 동일한 쿼리 블록을 여러 번 사용할 수 있어 중복 코드를 줄일 수 있습니다.
  4. 성능 최적화: 일부 경우에 쿼리 성능을 향상시킬 수 있습니다.
반응형

WITH 구문의 구조

WITH 구문은 다음과 같은 구조를 가집니다:

WITH CTE_테이블이름(열이름)
AS
(
    <쿼리문>
)
SELECT 열이름 FROM CTE_테이블이름;

이 구조를 통해 쿼리문의 결과를 임시 테이블인 CTE_테이블에 담고, 하단의 SELECT 구문에서 해당 임시 테이블을 활용할 수 있습니다.

반응형

CTE_TABLE 사용 예제

기본 예제

다음은 WITH 구문을 사용한 간단한 예제입니다:

WITH abc(userid, total)
AS
(
    SELECT userid, SUM(price * amount)
    FROM buyTbl
    GROUP BY userid
)
SELECT * FROM abc
ORDER BY total DESC;

위 예제에서 abc라는 임시 테이블을 생성하고, buyTbl에서 userid별로 총합을 계산한 후, 그 결과를 내림차순으로 정렬합니다.

반응형

중복 CTE 예제

WITH 구문은 중복 CTE도 허용합니다. 다음은 여러 개의 CTE를 사용하는 예제입니다:

WITH 
  AAA (컬럼들)
     AS (AAA의 쿼리문),
  BBB (컬럼들)
     AS (BBB의 쿼리문),
  CCC (컬럼들)
     AS (CCC의 쿼리문)
SELECT * FROM [AAA 또는 BBB 또는 CCC];

위 예제에서는 AAA, BBB, CCC라는 세 개의 CTE를 정의하고, 각 CTE는 독립적인 쿼리문을 가집니다. 이 때 BBB는 AAA를 참조할 수 있지만, AAA는 BBB를 참조할 수 없습니다.

반응형

CTE_TABLE 활용 시 주의사항

CTE_TABLE을 활용할 때는 몇 가지 주의사항이 있습니다:

  1. 한정된 생명주기: CTE는 뷰와 달리 해당 쿼리문이 수행되는 세션에서만 존재합니다. 세션이 종료되면 CTE도 사라집니다.
  2. 성능 고려: 모든 경우에 CTE가 성능을 향상시키는 것은 아닙니다. 복잡한 쿼리나 대량의 데이터를 다룰 때는 성능 테스트를 통해 최적의 방안을 찾아야 합니다.
  3. 명확한 열 목록: CTE에서 사용하는 열 목록과 AS 이하의 SELECT 문에서 사용하는 열 목록은 동일해야 합니다. 그렇지 않으면 오류가 발생합니다.
반응형

기타 활용 방법

CTE_TABLE은 다양한 상황에서 유용하게 활용될 수 있습니다. 예를 들어, 재귀 쿼리, 복잡한 조인, 그룹핑 및 집계 쿼리 등에서 큰 효과를 발휘합니다. 다음은 재귀 쿼리 예제입니다:

WITH RECURSIVE EmployeeCTE (EmployeeID, ManagerID, Level)
AS
(
    SELECT EmployeeID, ManagerID, 0 AS Level
    FROM Employees
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.EmployeeID, e.ManagerID, Level + 1
    FROM Employees e
    INNER JOIN EmployeeCTE ecte ON e.ManagerID = ecte.EmployeeID
)
SELECT * FROM EmployeeCTE;

위 예제는 조직도와 같은 계층 구조를 재귀적으로 탐색하는 쿼리입니다. EmployeeCTE는 루트 노드에서 시작하여 각 레벨별로 직원을 나열합니다.

 

이처럼 WITH CTE_TABLE 구문은 SQL 쿼리를 보다 쉽고 명확하게 작성하는 데 큰 도움이 됩니다. 다양한 예제와 활용 방법을 통해 CTE의 강력한 기능을 최대한 활용해 보세요.

 

반응형