CTE(Common Table Expressions)의 활용법 – 서브쿼리보다 명확한 쿼리 작성

Posted by heoncode
2025. 4. 12. 11:49 SQL 기초 정리
반응형
SMALL

SQL에서 복잡한 쿼리를 작성할 때, 서브쿼리로만 해결하기 어려운 경우가 많습니다. 이럴 때 CTE (Common Table Expressions), 즉 WITH 구문을 사용하면 쿼리의 가독성과 유지보수를 크게 향상시킬 수 있습니다.

CTE의 기본 구조

CTE는 쿼리 상단에 WITH 절로 정의하며, 마치 임시 테이블처럼 재사용할 수 있습니다. 기본 구조는 다음과 같습니다.

WITH cte_name AS (
    SELECT ... FROM ...
)
SELECT * FROM cte_name;

첫 번째 부분에서 cte_name 이라는 이름의 CTE를 정의하고, 이후 메인 쿼리에서 이를 참조합니다.

CTE 사용의 장점

  1. 가독성 향상
    복잡한 로직을 여러 단계로 나누어 각각의 CTE로 정의하면, 전체 쿼리의 흐름을 한눈에 파악할 수 있어 디버깅과 협업에 유리합니다.

  2. 재사용성
    한 번 정의한 CTE를 메인 쿼리 내에서 여러 번 사용할 수 있으므로, 같은 로직을 반복 작성할 필요가 없습니다.

  3. 재귀 쿼리 작성
    CTE는 재귀적 호출을 지원하여, 계층적 데이터(예: 조직도나 카테고리 구조)를 쉽게 처리할 수 있습니다.

실무 예시: 고객별 최근 주문 내역과 누적 주문 수

아래 예시는 고객 테이블과 주문 테이블을 기반으로, 각 고객의 최근 주문 날짜와 누적 주문 수를 CTE로 먼저 계산한 후, 이를 메인 쿼리에서 결합하는 예시입니다.

WITH order_summary AS (
    SELECT customer_id,
           COUNT(*) AS total_orders,
           MAX(order_date) AS last_order_date
    FROM orders
    GROUP BY customer_id
)
SELECT c.customer_id, c.name,
       o.total_orders, o.last_order_date
FROM customers c
LEFT JOIN order_summary o ON c.customer_id = o.customer_id;

이 쿼리는 주문 집계 로직을 별도로 분리하여, 고객 테이블과 조인할 때 단순하게 결과를 얻을 수 있습니다.

마무리

CTE(Common Table Expressions)는 복잡한 쿼리를 구조화하고 가독성을 높이는 데 매우 유용한 도구입니다. 서브쿼리로 얽힌 코드를 단순화하고, 재사용 가능한 형태로 구현할 수 있으므로, 실무에서 적극 활용하는 것이 좋습니다.

#SQL #CTE #WITH구문 #공통테이블표현 #쿼리최적화 #SQL기초 #실무팁 #데이터베이스

반응형
LIST

CASE WHEN 구문의 활용법 – 조건 분기와 표현식을 동시에 해결하는 방법

Posted by heoncode
2025. 4. 11. 21:59 SQL 기초 정리
반응형
SMALL

SQL에서 조건에 따라 다른 값을 출력해야 할 때 CASE WHEN 구문을 사용합니다. 이는 프로그래밍 언어에서의 if-else처럼 조건 분기를 처리할 수 있도록 도와주며, 특히 SELECT 문 안에서 동적으로 컬럼 값을 제어할 때 자주 사용됩니다.

CASE WHEN의 기본 구조

CASE 구문은 다음과 같은 형식으로 작성합니다.

SELECT 컬럼명,
       CASE
           WHEN 조건1 THEN 결과1
           WHEN 조건2 THEN 결과2
           ELSE 기본값
       END AS 별칭
FROM 테이블명;

조건이 참인 첫 번째 WHEN 절이 실행되고, 해당 조건이 모두 거짓인 경우 ELSE 절의 값이 반환됩니다.

실무 예시: 고객 등급 분류

예를 들어, 고객의 구매 금액을 기준으로 등급을 나누는 쿼리는 다음과 같습니다.

SELECT 고객명,
       구매금액,
       CASE
           WHEN 구매금액 >= 100000 THEN 'VIP'
           WHEN 구매금액 >= 50000 THEN '우수'
           ELSE '일반'
       END AS 고객등급
FROM 고객테이블;

이 쿼리를 사용하면 금액에 따라 각 고객이 어떤 등급인지 자동으로 분류할 수 있습니다.

GROUP BY, ORDER BY와 함께 사용

CASE 문은 GROUP BYORDER BY와 함께 쓰일 때도 강력한 유연성을 발휘합니다. 예를 들어, 지역별로 '수도권'과 '비수도권'을 나눠 집계하고 싶을 때는 다음과 같이 활용합니다.

SELECT
    CASE
        WHEN 지역 IN ('서울', '경기', '인천') THEN '수도권'
        ELSE '비수도권'
    END AS 권역,
    COUNT(*) AS 고객수
FROM 고객테이블
GROUP BY
    CASE
        WHEN 지역 IN ('서울', '경기', '인천') THEN '수도권'
        ELSE '비수도권'
    END;

주의할 점

  • CASE 구문은 WHERE 절에서 직접 사용할 수 없습니다. 조건 분기가 필요한 경우엔 서브쿼리나 CTE(Common Table Expression)로 처리하는 것이 일반적입니다.
  • 조건 순서가 중요합니다. 먼저 작성된 WHEN 조건부터 평가되므로, 조건이 중첩될 수 있는 경우에는 우선순위를 고려해야 합니다.

마무리

CASE WHEN 구문은 SQL에서 데이터를 조건에 따라 분기해 보여줄 때 매우 유용한 도구입니다. 특히 복잡한 조건을 단일 컬럼 안에서 처리할 수 있어 가독성과 유지보수 측면에서도 장점이 많습니다. 실무에서도 흔히 사용되는 만큼, 다양한 상황에 적용해보며 익숙해지는 것이 중요합니다.

#SQL #CASE문 #조건분기 #SQL기초 #WHENTHEN #쿼리작성팁 #SELECT문 #데이터분석

반응형
LIST

JOIN 없이도 가능하다? SQL에서 서브쿼리로 해결하는 3가지 실무 상황

Posted by heoncode
2025. 4. 11. 15:55 SQL 기초 정리
반응형
SMALL

SQL에서 데이터를 합치기 위해 가장 먼저 떠오르는 키워드는 JOIN입니다. 하지만 모든 상황에서 JOIN이 꼭 필요한 것은 아닙니다. 실무에서는 JOIN을 쓰기 복잡하거나 성능상 불리할 때, 서브쿼리(Subquery)를 이용해 문제를 해결하기도 합니다. 이번 글에서는 JOIN 없이 서브쿼리만으로 해결할 수 있는 3가지 실무 상황을 소개합니다.

1. 특정 조건에 해당하는 값만 가져올 때

예를 들어 각 사원의 부서 이름을 출력하고 싶은데, 특정 부서만 필터링하고 싶다면 JOIN 없이도 다음과 같이 서브쿼리로 처리할 수 있습니다.

SELECT emp_name,
       (SELECT dept_name
        FROM department d
        WHERE d.dept_id = e.dept_id)
       AS dept_name
FROM employee e
WHERE e.dept_id IN (10, 20);

JOIN을 사용하지 않고도 서브쿼리로 필요한 부서명을 함께 출력할 수 있습니다.

2. 조건 비교를 위해 필요한 보조 데이터를 가져올 때

각 제품의 가격이 전체 평균보다 높은 제품만 찾고 싶다면, 아래와 같이 서브쿼리를 WHERE 절에 활용할 수 있습니다.

SELECT product_name, price
FROM product
WHERE price > (SELECT AVG(price) FROM product);

이처럼 전체 집계 결과와 비교할 때도 서브쿼리를 사용하면 JOIN 없이 해결할 수 있습니다.

3. 최근 거래 내역 등 특정 조건의 1건만 가져올 때

각 고객의 최근 주문 내역을 보고 싶다면, 관련 테이블을 JOIN하기보다 상관 서브쿼리를 사용할 수 있습니다.

SELECT c.customer_id,
       (SELECT order_date
        FROM orders o
        WHERE o.customer_id = c.customer_id
        ORDER BY order_date DESC
        FETCH FIRST 1 ROW ONLY)
       AS latest_order
FROM customer c;

이 방식은 고객 수가 많아도 간결하고 효율적인 쿼리를 작성할 수 있게 해줍니다.


JOIN은 강력한 도구지만, 서브쿼리는 구조를 단순화하거나 불필요한 조인을 줄이는 데 유용하게 쓰일 수 있습니다. 실무에서는 복잡한 조인보다 오히려 서브쿼리로 명확하게 표현하는 것이 유지보수나 성능 측면에서 더 나은 선택이 되는 경우도 많습니다.

#SQL #서브쿼리 #JOIN #실무팁 #쿼리작성 #DB초보 #SQL기초

반응형
LIST