반응형
MySQL에서 SELECT 구문으로 데이터를 조회할 때, 특정 조건에 따라 다른 값을 반환하고 싶을 때가 있다.
이럴 때 사용하는 게 바로 CASE 문과 IF 함수이다.
이 기능은 단순한 조회를 넘어서, 조건별 분기 로직을 쿼리 내에서 직접 구현할 수 있게 해준다.
예를 들어, 성별 코드가 'M'이면 '남자', 'F'면 '여자'로 표기하고 싶은 경우,
바로 이 CASE나 IF 문을 사용할 수 있다.

📌 CASE WHEN THEN END – 조건 분기 문법
가장 기본적인 형태는 아래와 같다:
SELECT
name,
gender,
CASE
WHEN gender = 'M' THEN '남자'
WHEN gender = 'F' THEN '여자'
ELSE '기타'
END AS gender_label
FROM users;
- 성별 코드에 따라 문자로 변환된 결과를 반환함
- ELSE 구문을 통해 예외 처리도 가능
CASE 문은 SQL의 if/else 문과 동일한 기능을 하며,
MySQL에서 가장 널리 쓰이는 조건 분기 방식이다.
반응형
🧪 실전 예제 1 – 점수에 따른 등급 분류
SELECT
student_name,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END AS grade
FROM students;
이런 방식은 학교 성적 처리, 고객 등급 분류, 매출 구간 처리 등에 매우 유용하다.
✅ IF(expr, true_value, false_value) – 간단한 2분기
간단한 조건 하나만 분기할 땐 IF() 함수도 사용할 수 있다.
SELECT
name,
age,
IF(age >= 18, '성인', '미성년자') AS status
FROM users;
- 나이가 18세 이상이면 '성인', 아니면 '미성년자' 출력
- IF()는 단순 조건문에 적합하다 (복잡한 다중 분기에는 부적절)
🧪 실전 예제 2 – 회원 상태 변환
SELECT
user_id,
login_attempts,
IF(login_attempts > 5, '잠김', '정상') AS 계정상태
FROM members;
- 로그인 실패 횟수를 기반으로 계정 상태 분기
반응형
✅ CASE와 IF의 차이
| 구분 | CASE | IF |
| 분기 수 | 다중 조건 가능 | 단일 조건만 처리 |
| 가독성 | 복잡한 로직에 적합 | 짧고 단순한 조건에 적합 |
| ANSI SQL | 표준 SQL | MySQL 전용 함수 |
복잡한 로직이나 여러 조건이 필요한 경우에는 CASE 문을,
단순한 TRUE/FALSE 분기는 IF 함수를 사용하면 된다.
✅ SELECT + 조건 분기 + GROUP BY 활용
SELECT
department,
COUNT(*) AS 인원수,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS 남자수,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS 여자수
FROM employees
GROUP BY department;
- 부서별 인원수, 남자수, 여자수를 집계하는 실전 예제
- CASE와 집계 함수의 조합은 보고서 자동화에 매우 강력함
⚠️ 주의할 점
- CASE 문 안에서 =, LIKE, IS NULL 등 다양한 조건 사용 가능
- 문자열이나 숫자 모두 조건값으로 비교 가능
- NULL값은 주의해서 비교할 것 (NULL은 일반 비교 연산 안 됨)
📎 공식 문서 참고
반응형
'DB' 카테고리의 다른 글
| [MySQL] SELECT 문에서 EXISTS와 IN 조건절 (1) | 2025.06.26 |
|---|---|
| [MySQL] SELECT + 서브쿼리 활용법 (쿼리 안에 쿼리) (0) | 2025.06.26 |
| [MySQL] SELECT JOIN 완벽 정리 – INNER JOIN, LEFT JOIN, RIGHT JOIN 차이와 실전 예제 (0) | 2025.06.25 |
| [MySQL] SELECT + DATE_FORMAT / NOW() 함수 완벽 정리(날짜포맷, 현재시간) (0) | 2025.06.25 |
| [MySQL] SELECT + COUNT, SUM, AVG, MAX, MIN 집계 함수 완전 정복 (0) | 2025.06.25 |
| [MySQL] SELECT DISTINCT – 중복된 데이터 없이 깔끔하게 조회하는 법 (0) | 2025.06.25 |
| [MySQL] SELECT LIMIT / OFFSET (행의 개수 제한 / 페이징 처리) (0) | 2025.06.24 |
| [MySQL] SELECT GROUP BY + HAVING (그룹화와 조건 필터링) (0) | 2025.06.24 |