๐ซ SQL์์ NULL ๋ค๋ฃจ๊ธฐ
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ๊ฐ์ด ๋น์ด์๋ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค.
SQL์์ ์ด "๋น์ด์์"์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ์ ๋ฆฌํด ๋ดค์ต๋๋ค ๐
๐๏ธ ์์ ํ
์ด๋ธ โ employees
| id | name | salary | bonus |
|---|---|---|---|
| 1 | kim | 3000 | 500 |
| 2 | lee | 2500 | NULL |
| 3 | park | NULL | NULL |
| 4 | choi | 3500 | 200 |
| 5 | jung | 2800 | 300 |
| 6 | han | NULL | 100 |
| 7 | yoon | 4000 | NULL |
| 8 | kang | 3200 | 400 |
CREATE DATABASE IF NOT EXISTS practice;
USE practice;
DROP TABLE IF EXISTS employees;
CREATE TABLE employees (
id INT,
name VARCHAR(10),
salary INT,
bonus INT
);
INSERT INTO employees VALUES (1, 'kim', 3000, 500);
INSERT INTO employees VALUES (2, 'lee', 2500, NULL);
INSERT INTO employees VALUES (3, 'park', NULL, NULL);
INSERT INTO employees VALUES (4, 'choi', 3500, 200);
INSERT INTO employees VALUES (5, 'jung', 2800, 300);
INSERT INTO employees VALUES (6, 'han', NULL, 100);
INSERT INTO employees VALUES (7, 'yoon', 4000, NULL);
INSERT INTO employees VALUES (8, 'kang', 3200, 400);
โผ๏ธ ์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์๋ ๋ฌธ๋ฒ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ ๊ฒ์.
๐ง NULL์ด๋?
NULL์ ๊ฐ์ด ์์ ๋๋ ์ ์ ์์์ ์๋ฏธํฉ๋๋ค.
0์ด๋ ๋น ๋ฌธ์์ด('')๊ณผ๋ ๋ค๋ฆ
๋๋ค.
๐ค ์ฝ๊ฒ ์๊ฐํด๋ณผ๊ฒ์
์ค๋ฌธ์ง์์ ์๋ตํ์ง ์์ ํญ๋ชฉ์ ์๊ฐํด๋ณผ๊ฒ์.
0์ ์ ์ค ๊ฒ๋ ์๋๊ณ , ๊ณต๋ฐฑ์ ์
๋ ฅํ ๊ฒ๋ ์๋๋๋ค.
๊ทธ๋ฅ ๋ต์ ํ์ง ์์ ์ํ, ๊ทธ๊ฒ ๋ฐ๋ก NULL์ด์์.
โ ๏ธ NULL์ ๋น๊ต ์ฐ์ฐ์ด ๋์ง ์์ต๋๋ค
NULL์ =, != ๊ฐ์ ๋น๊ต ์ฐ์ฐ์๋ก ๋น๊ตํ ์ ์์ต๋๋ค. NULL = NULL๋ TRUE๊ฐ ์๋๋๋ค.
๐ NULL ๊ธฐ๋ณธ ๋ฌธ๋ฒ
๐น IS NULL โ NULL์ธ ํ ์ฐพ๊ธฐ
SELECT * FROM employees
WHERE salary IS NULL;
๐ฅ ๊ฒฐ๊ณผ
| id | name | salary | bonus |
|---|---|---|---|
| 3 | park | NULL | NULL |
| 6 | han | NULL | 100 |
๐น IS NOT NULL โ NULL์ด ์๋ ํ ์ฐพ๊ธฐ
SELECT * FROM employees
WHERE salary IS NOT NULL;
๐ฅ ๊ฒฐ๊ณผ
| id | name | salary | bonus |
|---|---|---|---|
| 1 | kim | 3000 | 500 |
| 2 | lee | 2500 | NULL |
| 4 | choi | 3500 | 200 |
| 5 | jung | 2800 | 300 |
| 7 | yoon | 4000 | NULL |
| 8 | kang | 3200 | 400 |
โ ๏ธ WHERE salary = NULL ์ ๋์ํ์ง ์์ต๋๋ค
NULL์ ๋ฐ๋์ IS NULL ๋๋ IS NOT NULL๋ก ๋น๊ตํด์ผ ํฉ๋๋ค.
= NULL๋ก ๋น๊ตํ๋ฉด ์๋ฌด ๊ฒฐ๊ณผ๋ ๋ฐํ๋์ง ์์ต๋๋ค.
๐ NULL ์ฒ๋ฆฌ ํจ์
๐ธ COALESCE() โ NULL์ด๋ฉด ๋์ฒด๊ฐ ๋ฐํ
COALESCE(๊ฐ1, ๊ฐ2, ๊ฐ3, ...)
์ฌ๋ฌ ๊ฐ ์ค ์ฒซ ๋ฒ์งธ๋ก NULL์ด ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
๐น bonus๊ฐ NULL์ด๋ฉด 0์ผ๋ก ์ถ๋ ฅ
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;
๐ฅ ๊ฒฐ๊ณผ
| name | bonus |
|---|---|
| kim | 500 |
| lee | 0 |
| park | 0 |
| choi | 200 |
| jung | 300 |
| han | 100 |
| yoon | 0 |
| kang | 400 |
๐น ์ฌ๋ฌ ์ปฌ๋ผ์ ์์๋๋ก ์ ์ฉํ๊ธฐ
SELECT name, COALESCE(bonus, salary, 0) AS ์ง๊ธ์ก
FROM employees;
bonus๊ฐ NULL์ด๋ฉด salary๋ฅผ ํ์ธํ๊ณ , ๊ทธ๊ฒ๋ NULL์ด๋ฉด 0์ ๋ฐํํฉ๋๋ค.
โน๏ธ IFNULL()๊ณผ์ ์ฐจ์ด
IFNULL(๊ฐ, ๋์ฒด๊ฐ)์ MySQL/MariaDB ์ ์ฉ ํจ์๋ก ์ธ์๋ฅผ 2๊ฐ๋ง ๋ฐ์ต๋๋ค.
COALESCE()๋ ANSI SQL ํ์ค์ผ๋ก ๋ชจ๋ DB์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ฐ์ ์ ์์ด์.
ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด COALESCE()๋ฅผ ์ฐ๋ ๊ฒ ๋ ์ข์ต๋๋ค.
๐น IFNULL() ์ฌ์ฉ ์์
SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;
bonus๊ฐ NULL์ด๋ฉด 0์ผ๋ก ๋์ฒด๋ฉ๋๋ค.COALESCE(bonus, 0)๊ณผ ๊ฒฐ๊ณผ๋ ๊ฐ์ง๋ง MySQL/MariaDB์์๋ง ๋์ํฉ๋๋ค.
๐ธ NULLIF() โ ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด NULL ๋ฐํ
NULLIF(๊ฐ1, ๊ฐ2)
๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด NULL์, ๋ค๋ฅด๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
๐น bonus๊ฐ 0์ด๋ฉด NULL๋ก ์ถ๋ ฅ
SELECT name, NULLIF(bonus, 0) AS bonus
FROM employees;
bonus๊ฐ 0์ด๋ฉด NULL๋ก ๋ฐ๊ฟ์ค๋๋ค.
์ฃผ๋ก 0์ผ๋ก ๋๋๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ๋ ๋ง์ด ์๋๋ค.
โ ๏ธ 0์ผ๋ก ๋๋๊ธฐ ์ค๋ฅ ๋ฐฉ์ง
-- salary๋ฅผ bonus๋ก ๋๋ ๋, bonus๊ฐ 0์ด๋ฉด ๋๋๊ธฐ ์ค๋ฅ ๋ฐฉ์ง
SELECT name, salary / NULLIF(bonus, 0) AS ratio
FROM employees;
๐ ํจ์ ๋น๊ต
| ํจ์ | ์ค๋ช | ์ง์ DB |
|---|---|---|
IS NULL |
NULL ์ฌ๋ถ ํ์ธ | ๋ชจ๋ DB |
IS NOT NULL |
NULL์ด ์๋ ์ฌ๋ถ ํ์ธ | ๋ชจ๋ DB |
COALESCE() |
NULL์ด๋ฉด ๋ค์ ๊ฐ ํ์ธ, ์ฒซ NULL ์๋ ๊ฐ ๋ฐํ | ๋ชจ๋ DB (ํ์ค) |
IFNULL() |
NULL์ด๋ฉด ๋์ฒด๊ฐ ๋ฐํ (์ธ์ 2๊ฐ) | MySQL/MariaDB ์ ์ฉ |
NULLIF() |
๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด NULL ๋ฐํ | ๋ชจ๋ DB |
โ ๋ง๋ฌด๋ฆฌ
| ์ํฉ | ์ฌ์ฉ ๋ฌธ๋ฒ |
|---|---|
| NULL์ธ ํ ์ฐพ๊ธฐ | IS NULL |
| NULL์ด ์๋ ํ ์ฐพ๊ธฐ | IS NOT NULL |
| NULL์ด๋ฉด ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋์ฒด | COALESCE() |
| ํน์ ๊ฐ์ด๋ฉด NULL๋ก ๋ฐ๊พธ๊ธฐ | NULLIF() |
๐ ์ฐธ๊ณ ์๋ฃ
'Database > SQL ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ๊ธฐ์ด - WHERE (0) | 2026.03.20 |
|---|---|
| SQL ๊ธฐ์ด - ์ง๊ณ ํจ์(COUNT, AVG, SUM, MAX, MIN) (0) | 2026.03.20 |
| SQL ๊ธฐ์ด - GROUP BY - HAVING (0) | 2026.03.19 |
| SQL ๊ธฐ์ด - ORDER BY (0) | 2026.03.19 |
| SQL๊ธฐ์ด - SELECT (0) | 2026.03.17 |