모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

18강 / 전체 24강

CASE와 조건 표현

8분 읽기 조회 0

CASE WHEN으로 행 값에 따라 다른 결과를 반환하고, 조건부 집계와 데이터 분류·등급 표현에 활용합니다.

🎯 학습 목표

이 강을 마치면 CASE WHEN 표현식으로 행 값에 따라 다른 결과를 반환하는 조건 분기를 SQL에서 직접 구현할 수 있습니다. 데이터를 동적으로 분류·레이블링하고, COUNT(CASE WHEN …)처럼 조건부 집계를 작성할 수 있게 됩니다. 9강에서 잠깐 언급한 피벗 집계 패턴도 완전히 이해할 수 있습니다.

💡 CASE WHEN의 개념

이 섹션에서는 CASE WHEN이 어떤 역할을 하는지, 프로그래밍 언어의 if-else와 어떻게 대응되는지 살펴보겠습니다.

SQL은 절차적 언어가 아니라 선언적 언어입니다. 하지만 CASE WHEN 표현식을 사용하면 열 값에 따라 다른 결과를 반환하는 if-else 로직을 쿼리 안에서 표현할 수 있습니다.

CASE에는 두 가지 형태가 있습니다.

-- 형태 1: 단순 CASE (특정 열의 값과 비교)
CASE 열
  WHEN 값1 THEN 결과1
  WHEN 값2 THEN 결과2
  ELSE 기본결과
END

-- 형태 2: 검색 CASE (임의의 조건 표현식)
CASE
  WHEN 조건1 THEN 결과1
  WHEN 조건2 THEN 결과2
  ELSE 기본결과
END

ELSE는 선택 사항입니다. 생략하면 어떤 조건에도 해당하지 않을 때 NULL을 반환합니다. END는 반드시 써야 합니다. CASE 전체가 하나의 값을 반환하는 표현식이므로 SELECT, WHERE, ORDER BY, GROUP BY 어디에도 쓸 수 있습니다.

📊 데이터 분류와 레이블링

이 섹션에서는 CASE WHEN으로 기존 데이터를 의미 있는 범주로 분류하는 방법을 살펴보겠습니다.

도서 가격을 "저가/중가/고가"로 분류해 봅니다.

SELECT
  title,
  price,
  CASE
    WHEN price < 15000 THEN '저가'
    WHEN price < 25000 THEN '중가'
    ELSE '고가'
  END AS 가격대
FROM books
ORDER BY price;

결과에 가격대 열이 추가됩니다. 13,000원 → 저가, 14,000원 → 저가, 16,000원 → 중가, 22,000원 → 중가, 28,000원 → 고가, 33,000원 → 고가처럼 분류됩니다. CASE는 조건을 위에서 아래로 순서대로 평가해 처음 TRUE가 되는 WHEN에서 해당 THEN 값을 반환합니다.

주문 상태를 한국어로 변환합니다.

SELECT
  order_id,
  CASE status
    WHEN 'DONE'    THEN '배송완료'
    WHEN 'PENDING' THEN '처리중'
    WHEN 'CANCEL'  THEN '취소됨'
    ELSE status
  END AS 주문상태_한글,
  order_date
FROM orders
ORDER BY order_date DESC;

단순 CASE 형태를 사용해 status 열의 값을 한국어로 변환합니다. ELSE status는 예상치 못한 상태 값이 있을 때 원래 값을 그대로 표시합니다.

회원 등급에 따라 혜택 메시지를 만들어 봅니다.

SELECT
  name,
  grade,
  CASE grade
    WHEN 'VIP'     THEN '무료 배송 + 5% 추가 할인 혜택'
    WHEN 'PREMIUM' THEN '무료 배송 혜택'
    WHEN 'REGULAR' THEN '기본 배송비 적용'
    ELSE '등급 미설정'
  END AS 혜택안내
FROM members
ORDER BY
  CASE grade
    WHEN 'VIP' THEN 1
    WHEN 'PREMIUM' THEN 2
    ELSE 3
  END, name;

ORDER BY에도 CASE를 사용해 등급을 원하는 순서로 정렬합니다. VIP → PREMIUM → REGULAR → NULL 순서입니다.

🔢 조건부 집계 — CASE + 집계 함수

이 섹션에서는 CASE WHEN과 집계 함수를 결합해 조건부 집계(피벗 집계)를 작성하는 방법을 살펴보겠습니다.

9강에서 잠깐 소개한 조건부 집계 패턴입니다. COUNT나 SUM 안에 CASE WHEN을 넣으면 특정 조건의 행만 선택적으로 집계할 수 있습니다.

-- 상태별 주문 건수를 가로로 표시 (피벗)
SELECT
  COUNT(*) AS 전체건수,
  COUNT(CASE WHEN status = 'DONE'    THEN 1 END) AS 완료,
  COUNT(CASE WHEN status = 'PENDING' THEN 1 END) AS 대기중,
  COUNT(CASE WHEN status = 'CANCEL'  THEN 1 END) AS 취소됨
FROM orders;

COUNT(CASE WHEN status = 'DONE' THEN 1 END)에서 CASE는 상태가 DONE이면 1을, 아니면 NULL을 반환합니다. COUNT는 NULL을 제외하고 세므로 DONE인 행 수만 집계됩니다. 결과는 단 한 행에 전체 건수와 상태별 건수가 나란히 표시됩니다.

-- 가격대별 도서 수와 평균 가격
SELECT
  COUNT(CASE WHEN price < 15000 THEN 1 END) AS 저가_도서수,
  COUNT(CASE WHEN price BETWEEN 15000 AND 24999 THEN 1 END) AS 중가_도서수,
  COUNT(CASE WHEN price >= 25000 THEN 1 END) AS 고가_도서수,
  ROUND(AVG(CASE WHEN price < 15000 THEN price END), 0) AS 저가_평균,
  ROUND(AVG(CASE WHEN price >= 25000 THEN price END), 0) AS 고가_평균
FROM books;

AVG 안에서도 CASE WHEN이 동작합니다. 가격대 조건을 만족하는 행의 price 값만 집계하고 나머지는 NULL로 무시합니다.

-- 회원별 상태별 주문 건수 집계 (피벗)
SELECT
  m.name,
  COUNT(CASE WHEN o.status = 'DONE'    THEN 1 END) AS 완료,
  COUNT(CASE WHEN o.status = 'PENDING' THEN 1 END) AS 대기중,
  COUNT(CASE WHEN o.status = 'CANCEL'  THEN 1 END) AS 취소됨
FROM members AS m
LEFT JOIN orders AS o ON m.member_id = o.member_id
GROUP BY m.member_id, m.name
ORDER BY 완료 DESC;

LEFT JOIN + GROUP BY + 조건부 집계 조합입니다. 모든 회원에 대해 상태별 주문 건수가 가로로 집계됩니다. 주문 없는 회원은 모두 0으로 표시됩니다.

🔄 CASE와 NULL 처리 결합

이 섹션에서는 CASE WHEN으로 NULL을 다루는 고급 패턴을 살펴보겠습니다.

6강의 COALESCE는 NULL을 단순 기본값으로 치환했습니다. CASE WHEN을 사용하면 더 복잡한 NULL 처리 로직도 표현할 수 있습니다.

-- grade 상태에 따른 맞춤 메시지
SELECT
  name,
  CASE
    WHEN grade IS NULL    THEN '등급 미설정 — 구매 후 등급이 부여됩니다'
    WHEN grade = 'VIP'    THEN 'VIP 회원님, 최고 혜택을 누리세요!'
    WHEN grade = 'PREMIUM' THEN 'PREMIUM 회원님, 무료 배송 혜택이 있습니다'
    ELSE REGULAR 회원님, 구매 실적 누적 시 등급이 올라갑니다
  END AS 맞춤메시지
FROM members;

IS NULL 조건도 CASE WHEN 안에서 완벽히 동작합니다. CASE를 활용하면 NULL·일반값·여러 조건을 한 번에 처리할 수 있어 보고서 출력에서 매우 유용합니다.

📝 핵심 요약

이번 강에서 배운 내용을 정리하겠습니다.

패턴문법활용
검색 CASECASE WHEN 조건 THEN 값 … END복잡한 조건 분기, NULL 처리
단순 CASECASE 열 WHEN 값 THEN 결과 … END열 값을 다른 값으로 변환
조건부 COUNTCOUNT(CASE WHEN 조건 THEN 1 END)피벗 집계, 조건별 행 수
조건부 SUM/AVGSUM(CASE WHEN 조건 THEN 열 END)조건을 만족하는 행만 합계·평균
ORDER BY CASEORDER BY CASE 열 WHEN … THEN 숫자 END커스텀 정렬 순서 지정

CASE WHEN은 SQL에서 데이터를 조회하면서 동시에 변환·분류·집계할 수 있는 핵심 표현식입니다. 다음 19강에서는 SELECT 조회를 넘어 데이터를 추가(INSERT), 수정(UPDATE), 삭제(DELETE)하는 DML 문을 배웁니다. 실습 DB에 새로운 회원을 추가하고, 주문 상태를 변경하고, 오래된 데이터를 삭제하는 것을 직접 실습합니다.

관련 주제

  • CASE WHEN
  • 단순 CASE
  • 검색 CASE
  • 조건부 집계
  • COUNT CASE WHEN
  • 피벗 집계
  • 데이터 분류·레이블링
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • SQL·데이터베이스 입문 24강
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

SQL·데이터베이스 입문 24강

이 강의가 속한 시리즈는 총 24강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...