데이타베이스/MySQL

최신 MySQL 기능: 공통 테이블 표현식 (CTE)의 모든 것

shimdh 2025. 5. 6. 09:26
728x90

공통 테이블 표현식(CTE)은 SQL 쿼리 내에서 일시적인 결과 집합을 정의하는 혁신적인 방법으로, 데이터베이스 쿼리의 복잡성을 줄이고 가독성을 높이는 데 큰 도움을 줍니다. 이번 블로그 포스트에서는 CTE의 기본 구조, 재귀적 CTE, 성능 및 가독성 향상, 그리고 다른 SQL 구문과의 결합 가능성에 대해 자세히 살펴보겠습니다.

CTE의 기본 구조

CTE는 WITH 키워드로 시작하며, 그 다음에 정의된 이름과 SELECT 문이 뒤따릅니다. 기본적인 구조는 다음과 같습니다:

WITH cte_name AS (
    SELECT column1, column2
    FROM table_name
    WHERE condition
)
SELECT *
FROM cte_name;

예제: 특정 부서의 직원 조회

예를 들어, 직원 데이터베이스에서 특정 부서의 모든 직원을 조회하는 경우 다음과 같은 쿼리를 사용할 수 있습니다:

WITH SalesEmployees AS (
    SELECT EmployeeID, FirstName, LastName 
    FROM Employees 
    WHERE Department = 'Sales'
)
SELECT * 
FROM SalesEmployees;

위 예제에서는 "SalesEmployees"라는 이름의 CTE를 생성하여 판매 부서에 속한 모든 직원을 선택했습니다. 이처럼 CTE를 사용하면 쿼리의 목적이 명확해지고, 코드의 가독성이 높아집니다.

재귀적 CTE

재귀적 CTE는 자기 자신을 참조할 수 있는 특성을 가지고 있어, 계층적 데이터를 처리할 때 매우 유용합니다. 예를 들어, 조직도와 같은 계층적 관계에서 상사의 ID를 통해 하위 직원을 찾는 경우 다음과 같은 쿼리를 사용할 수 있습니다:

WITH RECURSIVE EmployeeHierarchy AS (
    SELECT EmployeeID, ManagerID, FirstName, LastName 
    FROM Employees 
    WHERE ManagerID IS NULL -- 최상위 관리자

    UNION ALL

    SELECT e.EmployeeID, e.ManagerID, e.FirstName, e.LastName 
    FROM Employees e
    INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
)
SELECT * 
FROM EmployeeHierarchy;

이 코드는 최상위 관리자를 기준으로 하여 해당 관리자의 모든 하위 직원을 재귀적으로 조회합니다. 이를 통해 복잡한 계층 구조를 쉽게 탐색할 수 있습니다.

성능 및 가독성 향상

CTE를 사용하는 주요 장점 중 하나는 가독성 향상입니다. 복잡한 쿼리가 있을 때 서브쿼리를 명확하게 분리함으로써 전체 쿼리의 이해도를 높일 수 있습니다. 또한 동일한 서브쿼리를 여러 번 호출해야 할 때마다 반복해서 작성하지 않아도 되므로 유지보수가 용이해집니다. 이는 개발자가 코드의 품질을 높이고, 오류를 줄이는 데 큰 도움이 됩니다.

CTE의 장점 요약

  • 가독성 향상: 복잡한 쿼리를 명확하게 분리하여 이해도를 높임.
  • 유지보수 용이: 동일한 서브쿼리를 반복 작성할 필요 없음.
  • 코드 품질 향상: 오류를 줄이고, 더 간결한 코드 작성 가능.

다른 SQL 구문과 결합 가능

CTE는 다양한 SQL 구문과 함께 사용할 수 있습니다. 예를 들어, JOINs를 통해 다른 테이블과 조인하여 추가 정보를 가져올 수 있으며, INSERT, UPDATE, DELETE 문에서도 활용 가능합니다.

예제: CTE를 활용한 데이터 업데이트

특정 조건을 만족하는 데이터를 업데이트하기 위해 CTE를 사용하는 방법은 다음과 같습니다:

WITH HighSalaryEmployees AS (
   SELECT EmployeeID 
   FROM Employees 
   WHERE Salary > 100000
)
UPDATE Employees 
SET Bonus = Bonus + 5000  
WHERE EmployeeID IN (SELECT EmployeeID FROM HighSalaryEmployees);

이 예제에서는 연봉이 높은 직원들에게 보너스를 추가하는 데 필요한 직원 ID 목록을 추출하기 위해 CTE를 사용했습니다. 이를 통해 데이터베이스의 효율적인 관리와 업데이트가 가능해집니다.

결론

공통 테이블 표현식(CTE)은 MySQL에서 복잡한 쿼리를 단순화하고 가독성을 높이며 효율적인 데이터 처리를 가능하게 해주는 강력한 도구입니다. 이를 통해 개발자는 보다 간결하고 유지보수하기 쉬운 코드를 작성할 수 있으며, 특히 재귀적 데이터 조회나 다중 레벨 조작 시 매우 유용합니다. CTE를 활용함으로써 데이터베이스 작업의 효율성을 극대화하고, 개발자의 생산성을 높일 수 있습니다.

728x90