본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL IF · IFNULL · NULLIF — 조건·NULL 처리 완전 정리

by 왕진 2026. 6. 27.
반응형

 

 

Database · MySQL

MySQL IF · IFNULL · NULLIF — 조건·NULL 처리 완전 정리

조건 하나로 값을 두 갈래로 나누고, NULL을 방어하고, 일부러 NULL을 만드는 세 가지 함수를 원리부터 이해한다
시작 오늘 분석할 코드

아래 세 줄은 짧지만 실무 SQL에서 가장 자주 등장하는 패턴을 모두 담고 있다. "조건에 따라 값을 바꾸기", "NULL이면 기본값으로 채우기", "같은 값이면 일부러 NULL로 만들기" — 이 세 가지는 리포트 쿼리, 통계 쿼리, 화면 표시용 쿼리 어디서든 쓰인다.

SELECT IF (100>200, '참이다', '거짓이다'); -- 100 > 200 은 200이 크므로 거짓임 / 결과값 거짓이다 출력. SELECT IFNULL(NULL, '널이군요'), IFNULL(100, '널이군요'); -- IFNULL(A,B)는 A값이 NULL이면 B를 출력 -- IFNULL 2번째에는 A값이 NULL이 아니기 때문에 A값 출력 100 SELECT NULLIF(100,100), IFNULL(200,100); -- NULLIF(A,B)는 A,B가 같으면 NULL을 출력 -- 같지 않으면 A값을 출력
실제 결과 미리보기
실행한 식 결과값
IF(100>200, '참이다', '거짓이다') 거짓이다
IFNULL(NULL, '널이군요') 널이군요
IFNULL(100, '널이군요') 100
NULLIF(100, 100) NULL
IFNULL(200, 100) 200
용어 용어 정리
IF()조건 하나를 검사해서 참이면 두 번째 인자, 거짓이면 세 번째 인자를 반환하는 3-인자 함수
IFNULL()첫 번째 인자가 NULL이면 두 번째 인자를, NULL이 아니면 첫 번째 인자를 그대로 반환하는 2-인자 함수
NULLIF()두 인자가 서로 같으면 NULL을, 다르면 첫 번째 인자를 반환하는 2-인자 함수 (IFNULL과 반대 방향)
NULL"값이 없다"는 상태 자체를 뜻하는 특수값. 0이나 빈 문자열('')과는 전혀 다른 개념
CASE WHEN여러 조건을 순서대로 검사해 처음 참인 조건의 결과를 반환하는 다중 분기 구문
COALESCE()인자를 여러 개 받아 그 중 처음으로 NULL이 아닌 값을 반환하는 함수. IFNULL의 확장판
IS NULLNULL 여부를 검사하는 전용 연산자. = NULL은 항상 실패하므로 반드시 이걸 써야 함
삼항 연산자다른 언어의 조건 ? 참 : 거짓 문법에 대응하는 개념. MySQL에선 이 역할을 IF()가 담당

1 IF(조건, 참값, 거짓값) — 조건 하나로 두 갈래 분기
왜 IF()가 필요한가?

쿼리 결과를 그대로 보여주는 대신 "조건에 따라 다르게 보여주고 싶은" 순간이 있다. 예를 들어 재고 수량이 0이면 "품절", 아니면 "판매중"이라고 표시하고 싶을 때 애플리케이션 코드에서 매번 분기하는 대신, SQL 단계에서 IF(재고=0, '품절', '판매중')처럼 한 번에 처리할 수 있다. IF()는 인자를 정확히 3개 받는다 — 조건, 참일 때 값, 거짓일 때 값. 이 순서를 벗어나면 함수 자체가 동작하지 않는다.

SELECT IF (100>200, '참이다', '거짓이다'); -- 100 > 200 은 거짓 → 세 번째 인자 '거짓이다' 반환
조건: 100 > 200 ?
거짓(FALSE)
세 번째 인자 '거짓이다' 반환

이 흐름을 반대로 조건이 참(TRUE)이었다면 두 번째 인자인 '참이다'가 그대로 반환됐을 것이다. IF()는 딱 이 두 갈래 외에는 다른 경로가 없다는 점이 핵심이다 — "세 번째, 네 번째 조건"은 애초에 존재하지 않는다.

※ IF()는 조건이 정확히 하나뿐이다. 조건이 여러 개로 늘어나면 IF를 중첩하기보다 CASE WHEN을 쓰는 게 가독성이 훨씬 좋다.

2 IFNULL(값, 대체값) — NULL을 만났을 때의 방어선
왜 IFNULL()이 필요한가?

테이블에는 값이 채워지지 않은 컬럼, 즉 NULL이 흔하다. 예를 들어 고객 테이블의 '별명' 컬럼이 비어있으면 화면에 그냥 빈칸이 뜨거나 "NULL"이라는 문자열이 그대로 노출돼 사용자에게 어색하게 보인다. IFNULL(별명, '이름 없음')처럼 감싸두면, 값이 있으면 그 값을, NULL이면 지정한 기본값을 안전하게 대신 보여줄 수 있다. IFNULL은 인자를 2개만 받는다는 점에서 IF()와 헷갈리기 쉬우니 주의한다.

SELECT IFNULL(NULL, '널이군요'), IFNULL(100, '널이군요'); -- 첫 번째: NULL이므로 대체값 '널이군요' 반환 -- 두 번째: 100은 NULL이 아니므로 원래값 100 그대로 반환
※ IFNULL(A, B)는 "A가 없으면 B"라는 뜻이다. A 자리엔 실제로 검사할 값, B 자리엔 대체할 기본값이 온다는 순서를 기억해두면 헷갈리지 않는다.

3 NULLIF(A, B) — 일부러 NULL을 만드는 함수
왜 반대로 NULL을 만들어야 하는가?

NULLIF는 IFNULL과 방향이 정반대다. IFNULL은 "NULL을 없애는" 함수라면, NULLIF는 "특정 조건에서 일부러 NULL을 만드는" 함수다. NULLIF(A, B)는 A와 B가 같으면 NULL을, 다르면 A를 그대로 반환한다. 대표적인 활용은 나눗셈에서 분모가 0이 되는 상황을 막는 것이다. 매출 / NULLIF(방문자수, 0)처럼 쓰면 방문자수가 0일 때 분모가 그대로 0이 되어 에러가 나는 대신 결과가 NULL로 처리돼 안전하게 넘어간다.

SELECT NULLIF(100,100), IFNULL(200,100); -- NULLIF(100,100): 두 값이 같으므로 NULL 반환 -- IFNULL(200,100): 200은 NULL이 아니므로 200 그대로 반환
※ NULLIF(A,B)를 "다르면 NULL"이라고 거꾸로 외우는 실수가 잦다. 정확히는 "같으면 NULL, 다르면 A"다.
1
NULLIF(방문자수, 0)방문자수가 정확히 0인지 검사한다
2
같다면 → NULL 반환분모 자리가 NULL이 되므로 "0으로 나누기" 자체가 발생하지 않는다
3
다르다면 → 원래 방문자수 반환정상적인 값이면 그대로 나눗셈에 사용된다

 

반응형

 

4 NULL은 왜 "값"이 아니라 "상태"인가
왜 = NULL이 항상 실패하는가?

NULL은 0도, 빈 문자열도 아닌 "값이 없다"는 상태 그 자체다. 그래서 WHERE 컬럼 = NULL처럼 등호로 비교하면 SQL 엔진 입장에서는 "알 수 없는 것과 알 수 없는 것을 비교"하는 셈이라 항상 결과가 거짓(정확히는 UNKNOWN)으로 처리되어 단 한 행도 조회되지 않는다. NULL 여부를 검사할 땐 반드시 IS NULL / IS NOT NULL을 써야 한다. IF·IFNULL·NULLIF 세 함수 모두 이 NULL의 특수성을 다루기 위해 존재한다고 봐도 된다.

※ NULL이 낀 산술 연산(더하기, 곱하기 등)의 결과도 NULL이 된다. NULL은 "전염"되므로 집계 함수 이전에 IFNULL로 미리 방어하는 습관이 안전하다.
연산식 결과 이유
NULL = NULL NULL (UNKNOWN) 같은 "알 수 없음"끼리도 참/거짓을 단정할 수 없다
NULL + 1 NULL 값이 없는 것에 숫자를 더해도 여전히 값이 없다
NULL = 0 NULL (UNKNOWN) NULL은 0이 아니라 "값 자체가 없음"이므로 비교가 성립하지 않는다
IFNULL(NULL, 0) = 0 참(TRUE) IFNULL로 먼저 NULL을 0으로 바꿔야 비로소 정상 비교가 된다

5 IF() vs CASE WHEN — 언제 무엇을 쓸까
왜 둘 다 있고, 어떻게 골라 쓰는가?

IF()는 조건이 딱 하나일 때 짧게 쓰기 좋고, CASE WHEN은 조건이 여러 개로 늘어날 때 훨씬 읽기 편하다. IF를 중첩해서 IF(a, x, IF(b, y, z))처럼 쓰면 조건이 3개만 넘어가도 괄호가 겹쳐 읽기 어려워진다. 이럴 땐 CASE WHEN a THEN x WHEN b THEN y ELSE z END로 풀어 쓰는 편이 유지보수에 유리하다.

IF() 사용이 적합할 때
조건이 딱 1개, 결과가 2갈래뿐일 때. 짧은 표현식 안에서 간단히 처리하고 싶을 때.
CASE WHEN이 적합할 때
조건이 3개 이상, 등급·구간처럼 여러 분기가 필요할 때. 가독성과 유지보수를 우선할 때.

6 IFNULL() vs COALESCE() — 인자 개수의 차이
왜 COALESCE가 IFNULL의 상위 호환인가?

IFNULL은 인자를 정확히 2개만 받는다. 하지만 실무 데이터는 "이 값이 없으면 저 값, 저 값도 없으면 그 다음 값"처럼 대체값 후보가 여러 단계로 이어지는 경우가 많다. 이럴 때는 COALESCE(A, B, C, ...)처럼 인자를 원하는 만큼 나열해, 앞에서부터 NULL이 아닌 첫 값을 찾아낸다. COALESCE는 표준 SQL 함수라 다른 DB(Oracle, PostgreSQL 등)에서도 동일하게 쓰이므로, 여러 DB를 넘나드는 코드라면 COALESCE 쪽이 더 호환성 있다.

-- 별명이 없으면 닉네임, 닉네임도 없으면 '이름없음' SELECT COALESCE(별명, 닉네임, '이름없음') FROM 회원;
IFNULL(A, B)
인자 정확히 2개만 받는다. 대체값 후보가 딱 하나뿐일 때 짧게 쓰기 좋다. MySQL 전용 함수라 다른 DB로 옮기면 문법이 바뀔 수 있다.
COALESCE(A, B, C, ...)
인자를 원하는 만큼 나열할 수 있다. 대체값 후보가 여러 단계일 때, 또는 여러 DB에서 동일하게 동작해야 할 때 적합하다.
※ 대체값이 하나뿐이면 IFNULL이 더 짧고 명확하다. 굳이 모든 곳을 COALESCE로 바꿀 필요는 없다 — "인자가 2개 초과냐 아니냐"로 고르면 된다.

7 실무 활용 패턴 — 세 함수를 조합해서 쓰기
왜 실무 쿼리에서 이 셋을 같이 쓰게 되는가?

실제 리포트 쿼리에서는 IF·IFNULL·NULLIF가 한 문장 안에 섞여 등장하는 일이 흔하다. 대표적으로 "전환율 = 구매건수 / 방문건수"를 구할 때 방문건수가 0이면 0으로 나누는 에러가 나므로, NULLIF로 분모를 먼저 방어하고 IFNULL로 최종 결과의 NULL을 0으로 다시 채우는 이중 방어를 쓴다.

1
NULLIF(방문건수, 0)방문건수가 0이면 분모를 NULL로 만들어 나눗셈 에러를 방지한다
2
구매건수 / NULLIF(방문건수, 0)분모가 NULL이 되면 나눗셈 결과도 NULL로 나온다 (에러 대신 NULL)
3
IFNULL( ... , 0)최종 결과가 NULL이면 화면 표시용으로 0%로 바꿔준다
SELECT IFNULL(구매건수 / NULLIF(방문건수, 0), 0) AS 전환율 FROM 통계;
실무 체크리스트
  • 나눗셈 쿼리를 짤 땐 분모에 NULLIF(분모, 0)을 습관적으로 붙인다
  • 화면에 보여줄 값은 IFNULL로 사용자 친화적인 기본값으로 마무리한다
  • 조건이 3개 이상이면 IF 중첩 대신 CASE WHEN으로 바꾼다

8 자주 하는 실수
실수 증상 해결
IFNULL에 조건 3개를 넣으려고 시도 (IF와 혼동) "Incorrect parameter count" 에러 발생 조건 분기가 필요하면 IF(조건,참,거짓)을 사용한다
WHERE 컬럼 = NULL로 NULL 검사 항상 결과가 0행으로 나옴 WHERE 컬럼 IS NULL / IS NOT NULL 사용
NULLIF(A,B)를 "다르면 NULL"로 반대로 암기 조건 로직이 뒤바뀌어 의도와 반대로 동작 "같으면 NULL, 다르면 A"라는 원래 규칙 재확인
IFNULL(A,B)에서 대체값 B도 NULL일 수 있음을 간과 여전히 NULL이 나와 화면에 빈칸 노출 COALESCE(A,B,C,...)로 대체값 후보를 여러 단계로 준비
나눗셈 전에 NULLIF로 분모 방어를 하지 않음 분모가 0일 때 Division by zero 경고 또는 예기치 않은 결과 분모 자리에 NULLIF(분모, 0)을 습관적으로 적용

9 실무 체크 포인트 — NULL 방어 위치 정하기

NULL 처리 함수는 아무 곳에나 감싸면 되는 기능이 아니다. 원본 데이터의 의미를 보존할지, 계산 중 에러를 막을지, 화면에 보여줄 값을 정리할지에 따라 적용 위치가 달라진다.

1
원본 컬럼은 가능한 그대로 둔다저장된 NULL을 무조건 0이나 빈 문자열로 바꾸면 "값 없음"과 "값이 0"인 상태를 구분하기 어려워진다.
2
분모는 NULLIF로 먼저 방어한다나눗셈에서는 IFNULL보다 NULLIF(분모, 0)를 먼저 써서 0으로 나누는 상황을 없애는 편이 안전하다.
3
최종 출력은 IFNULL 또는 COALESCE계산 결과가 NULL일 때 사용자에게 보여줄 기본 문구나 기본 숫자는 마지막 SELECT 단계에서 결정한다.
4
조건이 늘어나면 CASE로 이동두 갈래 분기만 IF로 처리하고, 등급·상태·구간처럼 분기가 늘어나면 CASE WHEN으로 바꾼다.
정리하면 NULLIF는 위험한 계산을 막는 안전장치, IFNULL은 화면 표시용 기본값, COALESCE는 여러 후보 중 첫 유효값을 고르는 도구로 나눠서 쓰면 된다.

핵심 한 줄 요약

IF(조건, 참, 거짓)조건 하나를 검사해 값을 두 갈래로 나눈다
IFNULL(A, B)A가 NULL이면 B, 아니면 A를 그대로 반환한다
NULLIF(A, B)A와 B가 같으면 NULL, 다르면 A를 반환한다
NULL 비교= NULL은 항상 실패, IS NULL / IS NOT NULL을 써야 한다
실무 팁나눗셈은 NULLIF로 분모 방어, 화면 표시는 IFNULL/COALESCE로 마무리

Tags

#MySQL #IF #IFNULL #NULLIF #NULL처리 #조건함수 #CASEWHEN #COALESCE #SQL함수 #SQL #데이터베이스 #DB #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, IF, IFNULL, NULLIF, NULL처리, 조건함수, CASE WHEN, COALESCE, SQL함수, SQL, 데이터베이스, DB, 웹개발, 티스토리
반응형

댓글