Database ‐ CASE문 - dnwls16071/Backend_Summary GitHub Wiki

📚 CASE문

  • 단순 CASE문(Simple CASE Expression) & 검색 CASE문(Searched CASE Expression)으로 구분할 수 있다.

단순 CASE문(Simple CASE Expression)

  • 하나의 컬럼이나 표현식 결과 값에 따라 결과를 다르게 하고 싶을 때 사용한다.
CASE 비교대상_컬럼_또는_표현식
    WHEN 값1 THEN 결과1
    WHEN 값2 THEN 결과2
    ...
    ELSE 그_외의_경우_결과
END
  • 단순 CASE문도 위에서 아래로 순서대로 조건을 평가하며, 가장 먼저 일치하는 WHEN절을 만나는 순간 그 THEN의 결과를 반환하고 즉시 평가를 종료하게 된다.

검색 CASE문(Searched CASE Expression)

  • 단순 CASE문처럼 하나의 특정 값을 비교하는 대신, 각 WHEN절에 독립적인 조건식을 사용해 복잡한 논리를 구현할 때 사용한다.
CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ...
    ELSE 그_외의_경우_결과
END
  • 검색 CASE문도 위에서 아래로 순서대로 조건을 평가하며, 가장 먼저 참이 되는 WHEN절을 만나는 순간 그 THEN의 결과를 반환하고 즉시 평가를 종료한다. 순서가 매우 중요하게 작동한다.

❗검색 CASE문 사용 시 주의사항: WHEN절의 순서

  • 더 포괄적인(=범위가 넓은) 조건보다는 더 구체적인(=범위가 좁은) 조건을 먼저 배치하는 것이 좋다.

📚 CASE문 - 그룹핑

  • CASE문 분류(Classification) : CASE문을 사용해 하나의 라벨을 붙여준다.
  • CASE문 집계(Aggregation) : 만들어진 라벨을 기준으로 GROUP BY하고 COUNT() 함수를 사용해 라벨의 속성값에 대한 값을 구한다.
SELECT
    CASE
        WHEN YEAR(birth_date) >= 1990 THEN '1990년대생'
        WHEN YEAR(birth_date) >= 1980 THEN '1980년대생'
        ELSE '그 이전 출생'
    END AS birth_decade,
    COUNT(*) AS customer_count
FROM
    users
GROUP BY
    CASE
        WHEN YEAR(birth_date) >= 1990 THEN '1990년대생'
        WHEN YEAR(birth_date) >= 1980 THEN '1980년대생'
        ELSE '그 이전 출생'
    END;

📚 CASE문 - 조건부 집계

서브 쿼리를 사용하는 방법 - 각 상태별 카운트를 서브 쿼리로 미리 구해 메인 쿼리에서 이 값들을 조인하거나 활용하는 방법

결론부터 말하자면 해당 방식보다 CASE문을 활용한 다른 조건부 집계 방식이 권장된다.(높은 쿼리 성능)

SELECT
    (SELECT COUNT(*) FROM orders) AS total_orders,
    (SELECT COUNT(*) FROM orders WHERE status = 'COMPLETED') AS completed_count,
    (SELECT COUNT(*) FROM orders WHERE status = 'SHIPPED') AS shipped_count,
    (SELECT COUNT(*) FROM orders WHERE status = 'PENDING') AS pending_count;

COUNT(CASE ...) - COUNT 함수는 NULL이 아닌 모든 값을 센다는 특징을 사용하는 방법

COUNT(CASE WHEN status = 'COMPLETED' THEN 1 END)

SUM(CASE ...) - SUM 함수는 숫자들의 합계를 구한다.

SUM(CASE WHEN status = 'COMPLETED' THEN 1 ELSE 0 END)