SQL 마스터의 비밀 무기: CTE로 데이터 분석 레벨 업! 🚀

안녕하세요, 데이터 분석에 관심 있는 여러분! 오늘은 SQL의 숨겨진 보석, CTE(Common Table Expression)에 대해 알아보겠습니다. CTE는 복잡한 쿼리를 쉽게 만들고, 데이터를 더 효율적으로 분석할 수 있게 해주는 강력한 도구입니다. 이 글을 통해 여러분도 CTE 마스터가 될 수 있습니다! 👨‍💻👩‍💻

 CTE란 무엇일까요? 🤔


CTE는 SQL 쿼리 내에서 임시로 이름 붙여진 결과 집합입니다. 복잡한 쿼리를 작은 부분으로 나누어 이해하기 쉽게 만들어줍니다. WITH 절을 사용해 정의하며, 마치 레고 블록처럼 쿼리를 조립할 수 있게 해줍니다!


```sql

WITH MonthlySales AS (

    SELECT DATE_TRUNC('month', order_date) AS month,

           SUM(total_amount) AS total_sales

    FROM orders

    GROUP BY DATE_TRUNC('month', order_date)

)

SELECT month, total_sales

FROM MonthlySales

WHERE total_sales > 100000

ORDER BY month;

```


이 예제에서 MonthlySales CTE는 월별 총 판매액을 계산합니다. 메인 쿼리에서는 이 CTE를 사용해 10만 달러 이상의 월별 판매를 조회합니다.


 CTE의 장점 💪


1. 가독성 향상: 복잡한 쿼리를 논리적 부분으로 나눠 이해하기 쉽게 만듭니다.

2. 재사용성: 같은 쿼리 내에서 CTE를 여러 번 참조할 수 있습니다.

3. 유지보수 용이성: 쿼리의 각 부분을 독립적으로 수정할 수 있어 유지보수가 쉬워집니다.

4. 재귀 쿼리 가능: 계층적 데이터를 쉽게 처리할 수 있습니다.


 실전 예제: 직원 급여 분석 📊


회사의 직원 급여 데이터를 분석해봅시다. 부서별 평균 급여와 전체 평균 대비 각 직원의 급여 비율을 계산해보겠습니다.


```sql

WITH DeptAvg AS (

    SELECT department, AVG(salary) AS dept_avg_salary

    FROM employees

    GROUP BY department

),

CompanyAvg AS (

    SELECT AVG(salary) AS company_avg_salary

    FROM employees

)

SELECT e.employee_id, e.name, e.department, e.salary,

       d.dept_avg_salary,

       c.company_avg_salary,

       (e.salary / c.company_avg_salary * 100) AS percent_of_avg

FROM employees e

JOIN DeptAvg d ON e.department = d.department

CROSS JOIN CompanyAvg c

ORDER BY e.department, e.salary DESC;

```


이 쿼리는 두 개의 CTE를 사용합니다:

1. DeptAvg: 부서별 평균 급여 계산

2. CompanyAvg: 회사 전체 평균 급여 계산


메인 쿼리에서는 이 CTE들을 조인하여 각 직원의 급여 정보와 함께 부서 평균, 회사 평균, 그리고 회사 평균 대비 개인 급여 비율을 계산합니다.


 재귀 CTE로 조직도 탐색하기 🌳


재귀 CTE를 사용하면 계층적 데이터를 쉽게 다룰 수 있습니다. 회사의 조직도를 탐색하는 예제를 살펴볼까요?


```sql

WITH RECURSIVE OrgChart AS (

    -- 앵커 멤버: 최상위 관리자 (manager_id가 NULL인 경우)

    SELECT employee_id, name, manager_id, 1 AS level

    FROM employees

    WHERE manager_id IS NULL

    

    UNION ALL

    

    -- 재귀 멤버: 하위 직원들

    SELECT e.employee_id, e.name, e.manager_id, o.level + 1

    FROM employees e

    JOIN OrgChart o ON e.manager_id = o.employee_id

)

SELECT employee_id, name, level,

       REPEAT('    ', level - 1) || name AS hierarchy

FROM OrgChart

ORDER BY level, name;

```


이 쿼리는 회사의 조직 구조를 시각적으로 표현합니다. 각 직원의 레벨과 들여쓰기를 통해 계층 구조를 쉽게 확인할 수 있습니다.


 CTE 사용 시 주의사항 ⚠️


1. 성능 고려: CTE는 가독성을 높이지만, 때로는 성능에 영향을 줄 수 있습니다. 복잡한 쿼리의 경우 실행 계획을 확인하세요.

2. 재귀 제한: 재귀 CTE 사용 시 무한 루프를 방지하기 위해 적절한 종료 조건을 설정하세요.

3. 데이터베이스 호환성: 모든 데이터베이스 시스템이 CTE를 동일하게 지원하지 않을 수 있으므로 사용 중인 시스템의 문서를 참조하세요.


 마치며 🎉


CTE는 SQL 쿼리를 작성하는 방식을 혁신적으로 바꿀 수 있는 강력한 도구입니다. 복잡한 분석 작업을 간단하고 읽기 쉬운 코드로 변환할 수 있어, 데이터 분석가와 개발자 모두에게 큰 도움이 됩니다.


이제 여러분도 CTE를 활용해 더 효율적이고 우아한 SQL 쿼리를 작성해보세요. 데이터 분석의 새로운 차원을 경험하실 수 있을 거예요!


해피 코딩! 😊👍




#SQL #CTE #데이터분석 #데이터베이스 #코딩팁 #개발자스킬 #SQLTips #DataScience #BigData #DatabaseOptimization #RecursiveQueries #SQLPerformance #DataEngineering #TechBlog #프로그래밍 #쿼리최적화 #데이터엔지니어링 #테크블로그 #개발자공부


0 댓글