- 1 1. Introduction
- 2 2. What is the IFNULL function?
- 3 3. Practical examples of the IFNULL function
- 4 3.5 ORDER BY에서 NULL 값을 마지막에 배치
- 5 4. IFNULL와 COALESCE의 차이점
- 6 5. MySQL 이외의 데이터베이스에서 NULL 처리 함수
- 7 6. 자주 묻는 질문 (FAQ)
- 8 7. Conclusion
1. Introduction
데이터베이스 작업 시 NULL 값 처리는 중요한 포인트입니다.
특히, Oracle의 NVL 함수에 익숙한 사람들이 MySQL로 마이그레이션할 때 NVL이 사용 불가능하다는 것을 깨닫는 경우가 드물지 않습니다.
MySQL에서는 NVL 대신 IFNULL 함수를 사용하여 NULL 값을 적절히 처리할 수 있습니다.
이 기사에서는 IFNULL의 사용 방법과 다른 NULL 처리 함수와의 차이점을 포함하여 MySQL에서 NULL 값 작업 방법을 자세히 설명합니다.
1.1 What is a NULL value?
데이터베이스에서 NULL은 “값이 설정되지 않음”을 의미합니다.
이는 “0”이나 “빈 문자열”과 다르기 때문에, 제대로 처리하지 않으면 예상치 못한 오류나 잘못된 쿼리 결과가 발생할 수 있습니다.
예를 들어, 다음과 같은 데이터가 있다고 가정합니다.
| ID | Name | Age |
|---|---|---|
| 1 | Yamada | 25 |
| 2 | Sato | NULL |
| 3 | Suzuki | 30 |
위 데이터에서 ID “2” (Sato)의 나이는 NULL입니다.
그대로 계산을 실행하면 오류나 의도하지 않은 결과가 발생할 수 있습니다.
1.2 How MySQL handles NULL values
2. What is the IFNULL function?
MySQL은 NULL 값을 다른 값으로 대체하는 함수로 IFNULL 함수를 제공합니다.
이는 Oracle의 NVL 함수와 유사한 역할을 합니다.
NULL 값을 적절히 처리함으로써 누락된 데이터로 인한 계산 문제를 방지하고 더 안정적인 SQL 쿼리를 구축할 수 있습니다.
IFNULL의 기본 사용법을 자세히 살펴보겠습니다.
2.1 Basic syntax of IFNULL
IFNULL 함수의 기본 구문은 다음과 같습니다.
IFNULL(expression, fallback_value)
- expression : NULL을 확인할 열 또는 값
- fallback_value : expression이 NULL일 때 반환할 값 (NULL이 아니면 expression을 그대로 반환)
예를 들어, 다음 SQL 문을 고려해 보십시오.
SELECT IFNULL(NULL, 'Fallback value');
이 경우 NULL이 지정되었으므로 결과는 'Fallback value'가 됩니다.
| Result |
|---|
| Fallback value |
반면, NULL이 아닌 값을 지정하면 그 값이 그대로 반환됩니다.
SELECT IFNULL('Hello', 'Fallback value');
| Result |
|---|
| Hello |
2.2 Key characteristics of IFNULL
IFNULL 함수는 다음과 같은 특징을 가집니다.
- NULL 값을 특정 값으로 변환할 수 있습니다
- NULL을 포함할 수 있는 열에 대체 기본 값을 설정할 수 있습니다.
- 간단한 구문을 사용합니다
CASE표현식을 사용하는 것보다 작성하기 쉽습니다.
- 데이터 타입을 고려해야 합니다
IFNULL의 인수는 동일한 데이터 타입이어야 하는 것이 권장됩니다.
예를 들어, 다음 SQL은 오류를 발생시킬 수 있습니다.
SELECT IFNULL(100, 'Error');
이유: 숫자 타입 (100)과 문자열 타입 (‘Error’)이 혼합되었습니다.
이 경우, fallback 값도 숫자여야 합니다.
SELECT IFNULL(100, 0);
2.3 When you should use IFNULL
IFNULL이 유용한 실용적인 상황은 다음과 같습니다.
- NULL에 대한 기본 값 설정
- 예를 들어, 직원의 보너스가 NULL이면 0으로 설정합니다.
SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
- NULL을 포함한 계산 피하기
- NULL을 그대로 계산하면 결과도 NULL이 됩니다.
- NULL을 피하기 위해
IFNULL을 사용하면 의도된 계산을 수행할 수 있습니다.SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income FROM employees;
- 보고서와 집계에서 NULL을 적절히 처리
- 분석 중 NULL이 있으면 잘못된 보고서가 생성될 수 있습니다.
IFNULL을 사용하여 NULL을 특정 값으로 대체함으로써 데이터를 일관되게 처리할 수 있습니다.
3. Practical examples of the IFNULL function
이전 섹션에서 IFNULL 함수의 기본 사항을 설명했습니다.
이 섹션에서는 실제 데이터와 함께 사용하는 구체적인 예제를 소개하겠습니다.
3.1 Replace NULL values with a default value
테이블에 NULL 값이 포함되어 있으면 의도하지 않은 동작이 발생할 수 있습니다.
이를 해결하기 위해 IFNULL을 사용하여 NULL을 기본 값으로 대체할 수 있습니다.
예시: 직원의 보너스가 NULL인 경우 기본값을 0으로 설정
SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;
실행 전 데이터
| name | bonus |
|---|---|
| Sato | 5000 |
| Suzuki | NULL |
| Takahashi | 8000 |
IFNULL 적용 후
| name | bonus |
|---|---|
| Sato | 5000 |
| Suzuki | 0 |
| Takahashi | 8000 |
NULL을 0으로 바꾸면 집계 및 관련 처리가 원활해집니다.
3.2 NULL을 포함한 계산 피하기
MySQL에서는 NULL을 포함한 계산의 결과가 NULL이 됩니다.
따라서 NULL을 피하려면 IFNULL을 사용해야 합니다.
예시: 급여와 보너스의 합계 계산
SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
FROM employees;
실행 전 데이터
| name | salary | bonus |
|---|---|---|
| Sato | 300000 | 5000 |
| Suzuki | 280000 | NULL |
| Takahashi | 320000 | 8000 |
IFNULL 적용 후
| name | salary | bonus | total_income |
|---|---|---|---|
| Sato | 300000 | 5000 | 305000 |
| Suzuki | 280000 | 0 | 280000 |
| Takahashi | 320000 | 8000 | 328000 |
보너스가 NULL이면 총합(salary + bonus)도 NULL이 되지만, IFNULL을 적용하면 MySQL은 NULL을 0으로 간주하여 올바르게 계산합니다.
3.3 NULL을 다른 문자열로 대체
숫자뿐만 아니라 값이 NULL인 경우에도 기본 문자열을 설정할 수 있습니다.
예시: 이메일 주소가 없는 사용자에게 “Not registered” 표시
SELECT id, name, IFNULL(email, 'Not registered') AS email
FROM users;
실행 전 데이터
| id | name | |
|---|---|---|
| 1 | Sato | satou@example.com |
| 2 | Suzuki | NULL |
| 3 | Takahashi | takahashi@example.com |
IFNULL 적용 후
| id | name | |
|---|---|---|
| 1 | Sato | satou@example.com |
| 2 | Suzuki | Not registered |
| 3 | Takahashi | takahashi@example.com |
NULL 그대로 두면 필드가 비어 보이지만, IFNULL을 사용하면 “Not registered”로 명시됩니다.
3.4 WHERE 절에서 IFNULL 사용
NULL 값을 포함하는 조건에 따라 필터링하기 위해 WHERE 절에서 IFNULL을 사용할 수 있습니다.
예시: NULL 값을 가진 사용자만 조회
SELECT *
FROM users
WHERE IFNULL(email, '') = '';
이 SQL은 email이 NULL일 때 ''(빈 문자열)로 처리하고, 이메일이 NULL인 사용자만 조회합니다.
3.5 ORDER BY에서 NULL 값을 마지막에 배치
보통 ORDER BY를 사용할 때 NULL 값이 먼저 나타날 수 있지만, IFNULL을 사용하면 이를 마지막으로 이동시킬 수 있습니다.
예시: NULL 값을 가진 행을 마지막에 배치
SELECT name, salary
FROM employees
ORDER BY IFNULL(salary, 0) ASC;
4. IFNULL와 COALESCE의 차이점
MySQL은 NULL 값을 처리하기 위한 여러 함수를 제공하며, IFNULL와 COALESCE가 자주 비교됩니다.
두 함수 모두 NULL 값을 대체하지만, 사용 방식과 동작이 다릅니다.
이 섹션에서는 IFNULL와 COALESCE의 차이점 및 올바른 선택 방법을 설명합니다.
4.1 COALESCE 함수란?
COALESCE 함수는 여러 인수 중 첫 번째 NULL이 아닌 값을 반환합니다.
즉, IFNULL이 두 값 중 NULL이 아닌 값을 선택한다면,
COALESCE는 다수 후보 중 첫 번째 NULL이 아닌 값을 선택한다는 점에서 차이가 있습니다.
구문
COALESCE(expr1, expr2, ... , exprN)
- 왼쪽에서 오른쪽으로 평가하고 첫 번째 NULL이 아닌 값을 반환
- 모든 인수가 NULL이면 NULL을 반환
예시: COALESCE를 사용한 NULL 대체
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
이 경우 값은 다음과 같이 결정됩니다.
phone이 NULL이 아니면phone을 반환합니다.phone이 NULL이고email이 NULL이 아니면email을 반환합니다.phone과email모두 NULL이면'Not registered'를 반환합니다.
4.2 IFNULL와 COALESCE의 차이점
| Comparison item | IFNULL | COALESCE |
|---|---|---|
| NULL handling | Returns the fallback value if one expression is NULL | Evaluates multiple expressions and returns the first non-NULL value |
| Number of arguments | Only 2 | 2 or more (multiple allowed) |
| Use case | Simple NULL replacement | NULL handling with priority order |
| Execution speed | Fast (compares only 2 values) | Slightly slower (evaluates multiple values in order) |
4.3 IFNULL와 COALESCE 실용 예제
예시 1: 간단한 NULL 대체
IFNULL을 사용하면 두 값 중 NULL이 아닌 값을 선택할 수 있습니다.
SELECT name, IFNULL(phone, 'Not registered') AS contact_info
FROM customers;
결과
| name | phone | contact_info |
|---|---|---|
| Sato | 080-1234-5678 | 080-1234-5678 |
| Suzuki | NULL | Not registered |
예시 2: 첫 번째 사용 가능한 비NULL 값 선호
COALESCE를 사용하면 첫 번째 비NULL 값을 가져올 수 있습니다.
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
결과
| name | phone | contact_info | |
|---|---|---|---|
| Sato | 080-1234-5678 | satou@example.com | 080-1234-5678 |
| Suzuki | NULL | suzuki@example.com | suzuki@example.com |
| Takahashi | NULL | NULL | Not registered |
phone이 NULL이 아니면phone을 반환phone이 NULL이고email이 NULL이 아니면email을 반환phone과email이 모두 NULL이면'Not registered'를 반환
4.4 IFNULL와 COALESCE 중 선택하는 방법
✔ IFNULL를 사용해야 할 때
✅ NULL을 기본값으로 간단히 대체하고 싶을 때
✅ 두 개의 인수만으로 충분할 때 (예: NULL을 0으로 변환)
✔ COALESCE를 사용해야 할 때
✅ 첫 번째 비NULL 값을 찾고 싶을 때 (예: phone → email → “Not registered”)
✅ 세 개 이상 값을 평가해야 할 때
4.5 IFNULL와 COALESCE의 성능 비교
일반적으로 IFNULL가 COALESCE보다 빠릅니다.
이는 IFNULL가 두 개의 값만 평가하는 반면, COALESCE는 여러 값을 순차적으로 평가하기 때문입니다.
성능 테스트
IFNULL와 COALESCE를 100만 행에 적용하면 다음과 같은 결과가 나타날 수 있습니다.
| Function | Execution time (seconds) |
|---|---|
IFNULL | 0.02 |
COALESCE | 0.05 |
➡ 데이터 양이 많을 경우 IFNULL가 약간 더 빠를 수 있습니다.
➡ 하지만 대체값이 하나만 필요하면 IFNULL를 사용하고, 여러 후보가 필요하면 COALESCE를 사용하세요.

5. MySQL 이외의 데이터베이스에서 NULL 처리 함수
MySQL은 NULL 값을 처리하기 위해 IFNULL 함수를 제공하지만, 다른 데이터베이스 관리 시스템(DBMS)에서는 다른 함수를 사용합니다.
Oracle, PostgreSQL, SQL Server와 같은 주요 데이터베이스에서는 MySQL과 다른 NULL 처리 함수를 사용하는 것이 일반적입니다.
이 섹션에서는 MySQL 이외의 데이터베이스에서 NULL 값이 어떻게 처리되는지 설명합니다.
5.1 Oracle에서 NULL 처리: NVL 함수
Oracle에서는 MySQL의 IFNULL에 해당하는 NVL 함수가 제공됩니다.
NVL 함수는 지정된 값이 NULL일 때 다른 값을 반환합니다.
구문
NVL(expression, fallback_value)
- expression : NULL을 확인할 컬럼 또는 값
- fallback_value : NULL일 때 반환할 값 (NULL이 아니면 expression 그대로 반환)
예시
SELECT name, NVL(salary, 0) AS salary
FROM employees;
결과
| name | salary |
|---|---|
| Sato | 5000 |
| Suzuki | 0 |
| Takahashi | 8000 |
NVL의 동작은 MySQL의 IFNULL과 거의 동일하므로, Oracle에서는 간단히 NVL을 사용할 수 있습니다.
5.2 PostgreSQL 및 SQL Server에서 NULL 처리: COALESCE 함수
PostgreSQL과 SQL Server에서는 COALESCE 함수를 사용하여 NULL 값을 대체합니다.
이 함수는 여러 후보 중 첫 번째 비NULL 값을 반환할 수 있습니다.
구문
COALESCE(expr1, expr2, ..., exprN)
- 왼쪽에서 오른쪽으로 평가하여 첫 번째 비NULL 값을 반환
- 모든 인수가 NULL이면 NULL을 반환
예시
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
결과
| name | phone | contact_info | |
|---|---|---|---|
| Sato | 080-1234-5678 | satou@example.com | 080-1234-5678 |
| Suzuki | NULL | suzuki@example.com | suzuki@example.com |
| Takahashi | NULL | NULL | Not registered |
위와 같이 PostgreSQL 및 SQL Server에서는 COALESCE를 사용함으로써 MySQL의 IFNULL보다 더 유연한 NULL 처리가 가능합니다.
5.3 데이터베이스별 NULL 처리 함수 비교
| Database | NULL-handling function | Role |
|---|---|---|
| MySQL | IFNULL(expression, fallback_value) | Convert NULL to a fallback value |
| Oracle | NVL(expression, fallback_value) | Convert NULL to a fallback value (equivalent to IFNULL) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) | Return the first non-NULL value |
- 간단한 NULL 처리 →
IFNULL(MySQL) 또는NVL(Oracle) - 다수 후보 중 최적값 선택 →
COALESCE(PostgreSQL, SQL Server)
5.4 서로 다른 DBMS 간 마이그레이션 시 유의사항
다른 데이터베이스 간에 시스템을 마이그레이션할 때는 NULL 처리 함수의 차이에 주의해야 합니다.
특히 Oracle에서 MySQL로 마이그레이션할 경우 NVL을 IFNULL로 변환해야 합니다.
마이그레이션 시 변환 예시
- Oracle (NVL)
SELECT NVL(salary, 0) AS salary FROM employees;
- MySQL (IFNULL)
SELECT IFNULL(salary, 0) AS salary FROM employees;
- PostgreSQL / SQL Server (COALESCE)
SELECT COALESCE(salary, 0) AS salary FROM employees;
Also, because COALESCE can accept multiple arguments, it is more flexible than Oracle’s NVL or MySQL’s IFNULL.
During migration, it’s important to choose the correct function for the target database.
6. 자주 묻는 질문 (FAQ)
MySQL의 IFNULL 함수와 NULL 처리에 관한 질문은 개발자와 데이터베이스 관리자에게 중요합니다.
이 섹션에서는 IFNULL에 대한 일반적인 질문을 요약합니다.
Q1. IFNULL 함수와 NVL 함수는 동일한가요?
➡ 두 함수는 거의 동일한 기능을 제공하지만, 함수 이름은 데이터베이스에 따라 다릅니다.
| Database | NULL-handling function |
|---|---|
| MySQL | IFNULL(expression, fallback_value) |
| Oracle | NVL(expression, fallback_value) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) |
MySQL에서는 IFNULL을 사용하고, Oracle에서는 NVL을 사용하여 NULL 값을 대체 값으로 변환합니다.
Q2. IFNULL과 COALESCE의 차이점은 무엇인가요?
➡ IFNULL 두 인수 중 NULL이 아닌 값을 반환하고,
COALESCE 여러 인수 중 첫 번째 NULL이 아닌 값을 반환합니다.
| Function | Feature |
|---|---|
IFNULL(a, b) | If a is NULL, return b (only two arguments) |
COALESCE(a, b, c, ...) | Evaluates left to right and returns the first non-NULL value |
예시
SELECT IFNULL(NULL, 'Fallback value'); -- Result: 'Fallback value'
SELECT COALESCE(NULL, NULL, 'First non-NULL value'); -- Result: 'First non-NULL value'
✔ IFNULL을 사용해야 할 때
✅ NULL일 때 특정 기본값을 반환 (예: NULL이면 0)
✅ 두 값만 비교할 때
✔ COALESCE를 사용해야 할 때
✅ 첫 번째 NULL이 아닌 값을 가져옴 (예: 전화 → 이메일 → 기본값)
✅ 세 개 이상의 값을 평가해야 할 때
Q3. IFNULL을 숫자 이외의 데이터 타입에서도 사용할 수 있나요?
➡ 예. IFNULL은 문자열, 날짜, 숫자 등 다양한 데이터 타입에 사용할 수 있습니다.
예시 1: 문자열 사용
SELECT name, IFNULL(email, 'Not registered') AS email
FROM users;
예시 2: 날짜 사용
SELECT name, IFNULL(last_login, '2000-01-01') AS last_login
FROM users;
하지만 숫자와 문자열처럼 서로 다른 데이터 타입을 혼합하면 오류가 발생할 수 있으니 주의하세요.
SELECT IFNULL(100, 'Error'); -- May cause an error due to different data types
Q4. IFNULL 사용이 성능에 영향을 미치나요?
➡ 일반적으로 성능에 미치는 영향은 미미하지만, 대량의 데이터를 처리할 때는 영향을 줄 수 있습니다.
IFNULL은 두 값만 확인하기 때문에 보통 빠릅니다.- 하지만 수백만 행과 같은 매우 큰 데이터셋에서
IFNULL을 많이 사용하면 경우에 따라 인덱스 최적화에 영향을 줄 수 있습니다.
🔹 성능 최적화 팁
- 인덱스를 적절히 설정
IFNULL(column, 0) = 100와 같은 쿼리는 경우에 따라 인덱스 사용을 방해할 수 있습니다.- 한 가지 방법은 처음부터 NULL 대신 적절한 기본값을 저장하는 것입니다.
IFNULL은COALESCE보다 가볍습니다
COALESCE는 여러 값을 순차적으로 평가하기 때문에, 많은 경우에IFNULL이 더 빠를 수 있습니다.
Q5. IFNULL 대신 CASE를 사용할 수 있나요?
➡ 예. CASE를 사용해 유사한 동작을 구현할 수 있지만, 코드가 더 길어집니다.
IFNULL 사용 예
SELECT name, IFNULL(salary, 0) AS salary
FROM employees;
CASE 사용 예
SELECT name,
CASE WHEN salary IS NULL THEN 0 ELSE salary END AS salary
FROM employees;
✔ IFNULL은 간결하고 사용하기 쉽습니다
✔ CASE는 더 유연한 조건을 지원합니다 (예: NULL이 아닌 조건도 포함 가능).
Q6. IFNULL을 WHERE 절에서 사용할 수 있나요?
➡ 예. IFNULL은 WHERE 절 안에서 사용할 수 있습니다.
예시: 검색 시 NULL을 특정 값으로 대체
SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
이는 status가 NULL인 레코드를 조회합니다.
요약
IFNULL와NVL은 거의 동일한 기능을 제공하지만, DBMS에 따라 다릅니다IFNULL은 2개의 값을 평가하고,COALESCE는 여러 값을 평가합니다- 문자열, 날짜, 숫자 등 다양한 타입에서 사용할 수 있습니다
- 대용량 데이터셋에서는 인덱스 최적화를 고려하세요
IFNULL대신CASE를 사용할 수 있습니다IFNULL은WHERE절에서도 사용할 수 있습니다
7. Conclusion
In this article, we covered MySQL’s IFNULL function in detail, including how to handle NULL values, how it differs from other functions, and practical examples.
Finally, let’s briefly review what we covered.
7.1 What is the IFNULL function?
IFNULL는 지정된 값이 NULL일 때 대체 값을 반환합니다- 구문 :
IFNULL(expression, fallback_value)
- NULL을 피함으로써 계산 오류와 데이터 누락 문제를 방지할 수 있습니다
7.2 Practical examples of IFNULL
- NULL을 기본값(0 또는 특정 문자열)으로 대체
SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
- NULL이 포함된 계산을 올바르게 처리
SELECT name, salary + IFNULL(bonus, 0) AS total_income FROM employees;
- NULL을 “등록되지 않음”과 같은 적절한 문자열로 변환
SELECT id, IFNULL(email, 'Not registered') AS email FROM users;
WHERE절에서 NULL 값을 필터링하는 데 사용SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
7.3 Differences between IFNULL and COALESCE
IFNULL두 인수 중 NULL이 아닌 값을 반환COALESCE여러 인수 중 첫 번째 NULL이 아닌 값을 반환- 선택 기준
- 간단한 NULL 처리 →
IFNULL - 첫 번째 NULL이 아닌 값 선택 →
COALESCE
7.4 NULL handling in other DBMS
| Database | NULL-handling function |
|---|---|
| MySQL | IFNULL(expression, fallback_value) |
| Oracle | NVL(expression, fallback_value) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) |
- Oracle의
NVL은 MySQL의IFNULL과 거의 동일 - PostgreSQL 및 SQL Server는 일반적으로
COALESCE를 사용 - 마이그레이션 시 함수들을 적절히 교체해야 함
7.5 Performance and cautions for IFNULL
IFNULL은COALESCE보다 가볍다- 대용량 데이터셋에서는 인덱스 최적화에 영향을 받아 성능이 저하될 수 있다
- 데이터 타입을 일관되게 유지해야 함(숫자와 문자열 타입을 혼합하지 말 것)
7.6 Final takeaways
- MySQL에서는 NULL을 올바르게 처리하기 위해
IFNULL을 사용 - NULL에 영향을 받지 않고 데이터를 처리할 수 있음
COALESCE와NVL의 차이를 이해하고 적절한 함수를 사용- 데이터베이스 간 마이그레이션 시 NULL 처리 함수의 차이에 유의


