알고리즘 문제를 풀다가 SQL을 처음 접하면 가장 당황스러운 순간이 바로 "값을 직접 비교하고 대입하는 과정(할당, =)이 없다"는 점이다.
C++, Python, Java와 같은 언어에서는 for문으로 배열을 순회하며 if-else로 값을 변수에 대입하는 절차적(Imperative) 사고방식에 익숙해져 있다. 하지만 SQL은 데이터를 어떻게 처리할지 명시하는 것이 아니라, 결과적으로 무엇을 가져올지 선언하는 선언적(Declarative) 언어다.
따라서 원본 데이터를 변형하거나 변수에 값을 할당하는 대신, 전체 데이터 셋을 펼쳐놓고 조건에 맞는 새로운 파생 컬럼(Column)을 통째로 만들어낸다는 시각의 전환이 필요하다.
이번 글에서는 코딩테스트 SQL 문제에서 조건 분기를 처리할 때 반드시 알아야 할 3가지 핵심 무기를 해부해 본다.
CASE WHEN파이썬의 if - elif - else 구조를 SQL의 컬럼으로 투영해 내는 구문이다. 복잡한 다중 조건을 처리할 때 가장 많이 사용된다.
CASE
WHEN 조건1 THEN 반환값1
WHEN 조건2 THEN 반환값2
ELSE 모든 조건에 맞지 않을 때 반환값 (생략 시 NULL)
END AS 새로운_컬럼명
END와 AS의 역할END (필수): CASE 문의 끝을 알리는 '닫는 괄호' 역할을 한다. 프로그래밍 언어에서 if { ... }의 닫는 중괄호(})와 같다. END가 없으면 문법 에러가 발생한다.AS 새로운_컬럼명 (선택이나 필수 권장): AS는 계산된 결과가 들어갈 컬럼의 이름(별칭, Alias)을 지정해 준다. 생략할 경우 쿼리 실행 결과의 헤더(컬럼명)가 CASE WHEN... 구문 전체로 지저분하게 출력되므로, 가독성을 위해 반드시 명시하는 것이 좋다.회원의 누적 구매 금액(TOTAL_PRICE)에 따라 VIP, GOLD, SILVER 등급을 부여하는 경우를 생각해보자.
SELECT
MEMBER_ID,
TOTAL_PRICE,
CASE
WHEN TOTAL_PRICE >= 100000 THEN 'VIP'
WHEN TOTAL_PRICE >= 50000 THEN 'GOLD'
ELSE 'SILVER'
END AS MEMBER_GRADE
FROM
PURCHASE_HISTORY;
핵심 포인트: 변수에 'VIP'를 대입하는 것이 아니다!
SELECT조회 결과물에MEMBER_GRADE라는 가상의 열을 하나 더 생성하여, 각 행의 조건에 맞는 텍스트를 출력하게 하는 것이다.
IF 함수 (MySQL 특화)조건이 단순히 참(True)/거짓(False) 두 가지로만 나뉠 때는 CASE WHEN보다 삼항 연산자처럼 쓸 수 있는 IF 함수가 훨씬 간결하고 강력하다. 프로그래머스 코딩테스트 환경(MySQL)에서 유용하게 쓰인다.
IF(조건, 참일 때 반환값, 거짓일 때 반환값) AS 새로운_컬럼명
중고거래 게시판에서 상태(STATUS)가 'SALE'이면 '판매중', 그 외의 경우 '판매완료'로 출력해야 하는 경우다.
SELECT
BOARD_ID,
TITLE,
IF(STATUS = 'SALE', '판매중', '판매완료') AS STATUS_KOR
FROM
USED_GOODS_BOARD;
IFNULL코딩테스트에서 값을 직접 "대입"하고 싶게 만드는 가장 큰 원인은 바로 비어있는 NULL 데이터다. NULL 값을 다른 문자열이나 숫자로 대체하고 싶을 때는 IFNULL (또는 COALESCE)을 사용한다.
IFNULL(검사할_컬럼, NULL일_때_대체할_값) AS 컬럼명
이름(NAME)이 없는 동물의 이름을 "No name"으로 대체해서 출력해야 하는 경우다.
SELECT
ANIMAL_ID,
IFNULL(NAME, 'No name') AS NAME
FROM
ANIMAL_INS;
| 상황 | 사용 구문 | 특징 |
|---|---|---|
| 다중 조건 (3개 이상) | CASE WHEN ... THEN ... END | 범용적 표준 SQL, 다중 분기 처리에 최적화 |
| 단일 조건 (참/거짓) | IF(조건, 참, 거짓) | MySQL 지원, 삼항 연산자처럼 빠르고 간결함 |
| NULL 데이터 대체 | IFNULL(컬럼, 대체값) | NULL 값에 대한 디폴트 값 매핑 시 필수 사용 |
SQL 문제를 마주했을 때는 "원본 데이터를 수정하는 것이 아니라, 도화지(SELECT) 위에 내가 원하는 형태의 새로운 열(Column)을 그려낸다"고 시각화하자. 이 감각만 익히면 복잡한 코딩테스트 SQL 문제도 알고리즘처럼 명쾌하게 풀이할 수 있다!