



๐ก NULL ๋๋ฌธ์ ํ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ง๋ค. ์๋ฒฝํ๊ฒ ์ ๋ฆฌํ๋ค.
"๊ฐ์ด ์์" ์ ๋ํ๋ด๋ ํน์ํ ์ํ.
NULL โ 0
NULL โ ''
NULL โ FALSE
NULL = "์ ์ ์์"
SELECT
NULL = NULL, -- NULL (TRUE ์๋!)
NULL = 1, -- NULL
NULL != 1, -- NULL
NULL > 0, -- NULL
1 + NULL, -- NULL
'hello' || NULL -- NULL (PostgreSQL)
;
์ค์: NULL๊ณผ์ ๋ชจ๋ ๋น๊ต๋ NULL์ ๋ฐํ!
-- ์ด ์ฟผ๋ฆฌ๋ NULL์ธ ํ์ ๋ฐํํ์ง ์์!
SELECT * FROM users WHERE age != 30;
-- NULL์ธ ํ๋ ์ํ๋ฉด ๋ช
์์ ์ผ๋ก
SELECT * FROM users WHERE age != 30 OR age IS NULL;
[users]
| user_id | name | age | email |
|---------|------|-----|-------|
| 1 | ๊น์ฒ ์ | 30 | kim@test.com |
| 2 | ์ด์ํฌ | NULL | lee@test.com |
| 3 | ๋ฐ๋ฏผ์ | 25 | NULL |
| 4 | ์ต์ง์ | NULL | NULL |
-- โ ํ๋ฆฐ ๋ฐฉ๋ฒ
SELECT * FROM users WHERE age = NULL; -- ๊ฒฐ๊ณผ ์์!
-- โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
SELECT * FROM users WHERE age IS NULL; -- ์ด์ํฌ, ์ต์ง์
SELECT * FROM users WHERE age IS NOT NULL; -- ๊น์ฒ ์, ๋ฐ๋ฏผ์
-- age ๋๋ email์ด NULL์ธ ์ ์
SELECT * FROM users
WHERE age IS NULL OR email IS NULL;
SELECT
name,
age,
COALESCE(age, 0) AS age_or_zero, -- NULL์ด๋ฉด 0
COALESCE(email, '์์') AS email_or_default
FROM users;
| name | age | age_or_zero | email_or_default |
|---|---|---|---|
| ๊น์ฒ ์ | 30 | 30 | kim@test.com |
| ์ด์ํฌ | NULL | 0 | lee@test.com |
| ๋ฐ๋ฏผ์ | 25 | 25 | ์์ |
| ์ต์ง์ | NULL | 0 | ์์ |
SELECT COALESCE(NULL, NULL, 'hello', 'world');
-- ๊ฒฐ๊ณผ: 'hello' (์ฒซ ๋ฒ์งธ NOT NULL)
SELECT COALESCE(phone, mobile, email, '์ฐ๋ฝ์ฒ ์์') AS contact
FROM users;
SELECT
name,
IFNULL(age, 0) AS age
FROM users;
SELECT
name,
NVL(age, 0) AS age
FROM users;
| ํจ์ | DB | ํ๋ผ๋ฏธํฐ |
|---|---|---|
| COALESCE | ํ์ค SQL | ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ |
| IFNULL | MySQL | 2๊ฐ๋ง |
| NVL | Oracle | 2๊ฐ๋ง |
| ISNULL | SQL Server | 2๊ฐ๋ง |
โ COALESCE๊ฐ ๊ฐ์ฅ ๋ฒ์ฉ์ !
SELECT NULLIF(10, 10); -- NULL (๊ฐ์ผ๋ฉด NULL)
SELECT NULLIF(10, 20); -- 10 (๋ค๋ฅด๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ)
-- โ ์๋ฌ ๊ฐ๋ฅ (0์ผ๋ก ๋๋๊ธฐ)
SELECT revenue / count AS avg_revenue;
-- โ
์์ (count๊ฐ 0์ด๋ฉด NULL ๋ฐํ)
SELECT revenue / NULLIF(count, 0) AS avg_revenue;
SELECT
COUNT(*) AS total_rows, -- 4 (์ ์ฒด ํ)
COUNT(age) AS age_count, -- 2 (NULL ์ ์ธ)
SUM(age) AS age_sum, -- 55 (NULL ๋ฌด์)
AVG(age) AS age_avg -- 27.5 (55/2, NULL ์ ์ธ)
FROM users;
์ฃผ์: AVG๋ NULL์ ์ ์ธํ๊ณ ๊ณ์ฐ!
-- NULL์ 0์ผ๋ก ์นํ ํ ํ๊ท
SELECT AVG(COALESCE(age, 0)) AS avg_with_null_as_zero;
-- ๊ฒฐ๊ณผ: 13.75 (55/4)
SELECT age, COUNT(*)
FROM users
GROUP BY age;
| age | COUNT(*) |
|---|---|
| 30 | 1 |
| 25 | 1 |
| NULL | 2 |
ํฌ์ธํธ: NULL๋ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์!
| DB | NULL ์์น |
|---|---|
| MySQL | ์ค๋ฆ์ฐจ์ ์ ๋งจ ์ |
| PostgreSQL | ์ค๋ฆ์ฐจ์ ์ ๋งจ ๋ค |
| Oracle | ์ค๋ฆ์ฐจ์ ์ ๋งจ ๋ค |
-- MySQL: NULL์ ๋งจ ๋ค๋ก
SELECT * FROM users
ORDER BY age IS NULL, age;
-- PostgreSQL/Oracle: NULLS FIRST/LAST
SELECT * FROM users
ORDER BY age NULLS LAST;
-- users.department_id๊ฐ NULL์ธ ํ์ ๊ฒฐ๊ณผ์ ์์
SELECT u.*, d.name
FROM users u
JOIN departments d ON u.department_id = d.id;
SELECT u.*, COALESCE(d.name, '๋ฏธ๋ฐฐ์ ') AS dept_name
FROM users u
LEFT JOIN departments d ON u.department_id = d.id;
-- โ ์๋ ์ ํจ
CASE age
WHEN NULL THEN '๋ฏธ์
๋ ฅ' -- ์ด ์กฐ๊ฑด์ ์ ๋ TRUE ์ ๋จ!
ELSE '์
๋ ฅ๋จ'
END
-- โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
CASE
WHEN age IS NULL THEN '๋ฏธ์
๋ ฅ'
ELSE '์
๋ ฅ๋จ'
END
์ ๋ต ๋ณด๊ธฐ์ด๋ฉ์ผ์ด NULL์ธ ์ ์ ์๋ฅผ ๊ตฌํ์ธ์.
SELECT COUNT(*) AS null_email_count
FROM users
WHERE email IS NULL;
์ ๋ต ๋ณด๊ธฐ๋์ด์ ํ๊ท ์ ๊ตฌํ์ธ์. NULL์ 0์ผ๋ก ์ฒ๋ฆฌ.
SELECT AVG(COALESCE(age, 0)) AS avg_age
FROM users;
์ ๋ต ๋ณด๊ธฐ๋์ด๊ฐ 30์ด ์๋ ๋ชจ๋ ์ ์ ๋ฅผ ๊ตฌํ์ธ์. (NULL ํฌํจ)
SELECT *
FROM users
WHERE age != 30 OR age IS NULL;
-- ๋๋
SELECT *
FROM users
WHERE COALESCE(age, -1) != 30;
์ ๋ต ๋ณด๊ธฐ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ณ ํ๊ท ์ฃผ๋ฌธ ๊ธ์ก์ ๊ตฌํ์ธ์. (์ฃผ๋ฌธ์ด ์๋ ์นดํ ๊ณ ๋ฆฌ๋ ํฌํจ)
SELECT
category,
SUM(amount) AS total,
COUNT(*) AS cnt,
SUM(amount) / NULLIF(COUNT(*), 0) AS avg_amount
FROM orders
GROUP BY category;
= NULL ๋์ IS NULL ์ผ๋?[NULL ์ฒดํฌ]
IS NULL / IS NOT NULL (= NULL ์ฌ์ฉ ๊ธ์ง!)
[NULL ๋์ฒด]
COALESCE(๊ฐ1, ๊ฐ2, ...) โ ์ฒซ ๋ฒ์งธ NOT NULL
IFNULL(๊ฐ, ๋์ฒด๊ฐ) โ MySQL
[NULL ์์ฑ]
NULLIF(๊ฐ1, ๊ฐ2) โ ๊ฐ์ผ๋ฉด NULL
[์ง๊ณ์ NULL]
COUNT(*)๋ NULL ํฌํจ
COUNT(์ปฌ๋ผ)์ NULL ์ ์ธ
SUM, AVG ๋ฑ์ NULL ๋ฌด์
[์ฃผ์์ฌํญ]
NULL๊ณผ์ ๋น๊ต๋ ํญ์ NULL
JOIN ์ NULL์ ๋งค์นญ ์ ๋จ
[SQL ์๋ฆฌ์ฆ #9] UNION & ์งํฉ ์ฐ์ฐ โ ๋ฐ์ดํฐ ํฉ์น๊ธฐ
๐ NULL์ "์ ์ ์์"์ด๋ค.
= NULL ๋์ IS NULL, ๊ทธ๋ฆฌ๊ณ COALESCE๋ฅผ ์ต๊ด์ฒ๋ผ ์ฐ์!