์ NULL์ =์ด ์๋๋ผ is๋ฅผ ์ธ๊น
SQL ๋ฌธ๋ฒ์ ์ฒ์ ๋ฐฐ์ธ ๋, ๊ผญ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋ค. 'NULL์ ์ฐพ์ ๋๋ = NULL์ด ์๋๋ผ IS NULL์ ์ฌ์ฉํด์ผ ํ๋ค'. ์์ํ๋ค. ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ (๋ ผ๋ฆฌ ์ฐ์ฐ์์) NULL์ 0๊ณผ ๊ฐ์ด ์ทจ๊ธํ์ง ์๋๊ฐ. SQL์๋ ์ด๋ค ์ฐจ์ด์ ์ด ์๊ธธ๋ ์ด์ฒ๋ผ ํน๋ณํ๊ฒ NULL์ ๋ค๋ฃฐ๊น. ์ด๋ฒ ํฌ์คํธ์๋ SQL์ NULL์ ์ ์์ ๋ํด ์์๋ณด๋ฉด์ ์ ์๋ฌธ์ ๋ํด ํํค์ณ ๋ณธ๋ค.
๋ฐ์ดํฐ๊ฐ '์กด์ฌํ์ง ์๋ ๊ฐ' ๊ทธ๋์ '์์ง ๋ชจ๋ฅด๋ ๊ฐ'
SQL์์์ NULL์ ์ํค๋ฐฑ๊ณผ ๊ธฐ์ค์ผ๋ก ์ด๋ ๊ฒ ์ ์๋๋ค. 'Null ๋๋ NULL์ ๊ตฌ์กฐ์ ์ง์์ธ์ด(SQL)์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ์ง์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ ํ์์ด(Special marker)'.
์ด์ฒ๋ผ NULL์ '์กด์ฌํ์ง ์๋ ๊ฐ'์ด๋ค. 0๋ ์๋๊ณ STRING๋ ์๋๊ณ ๋ค๋ฅธ ์ด๋ ํ์ ๋ ์๋ ๊ทธ๋ฅ ์ ์ ์๋ ๊ฐ. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋ฐ๋ก ๋นผ ๋ ์ ์๋ค๋ ๊ฑด ๊ต์ฅํ ์ค์ํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
์๋ฅผ ๋ค์ด, Primary Key๋ฅผ ์ค์ ํ๋ค๊ณ ํ์. PK๋ NOTNULL, NULL ๊ฐ์ด์ด์๋ ์ ๋๋ค. SQL์์๋ PK์ NULL์ด ๋ค์ด์ค๋ฉด ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ก์จ ์๋ฏธ ์๋ ๋ก์ฐ๋ฅผ ์ฌ์ ์ ๊ฑธ๋ฌ ๋ผ ์ ์๋ค. ๋ค๋ฅธ ์ปฌ๋ผ์ ๊ฒฝ์ฐ์๋ NULL์ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค. 'NULL'์ด๋ผ๋ '์กด์ฌํ์ง ์๋ ๊ฐ'์ด ์ด๋ฏธ ์กด์ฌํ๋ '0'์ด๋ '9999' ์ฒ๋ผ ์๋ฏธ ์๋ ์๋ก ์กด์ฌํ์ง ์๋ ๊ฐ์ ์ฌ์ ์ํ ํ์๊ฐ ์๋ค. ์ด์ฒ๋ผ SQL์ NULL์ ์ฒดํฌํจ์ผ๋ก์จ SQL๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด์ ์ ํฉ์ฑ์ ํ๊ณ ํ ํ๊ณ ์๋ค.
NULL์ ํน์ฑ
์์ฒ๋ผ SQL์ NULL์ ํ ์ธ์ด์ ๋ค๋ฅธ ํํ๋ก ์ ์๋๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ๋ ์กฐ๊ธ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด๋ค์ง๋ค. ์๋์์ ์ง์ ์์์ ํจ๊ป ๋ณด๋ฉด์ NULL์ ํน์ฑ์ ์์๋ณด์.
A |
NULL |
1 |
1) ์ฌ์น์ฐ์ฐ
์์ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ํ์. ์ฒซ ๋ฒ์งธ ๋ก์ฐ๋ NULL์ด๊ณ ๋ ๋ฒ์งธ ๋ก์ฐ๋ ์ ์๋ค. ์ด ํ ์ด๋ธ์ ์ฌ์น์ฐ์ฐ์ ์ ์ฉํ๋ฉด:
SELECT A + 5, A - 5, A * 5, A / 5 FROM nullcheck;
A + 5 | A - 5 | A * 5 | A / 5 |
NULL | NULL | NULL | NULL |
6 | -4 | 5 | 0.2 |
๋ค ์ฐ์ฐ ๋ชจ๋ ๋์ผํ๊ฒ NULL ๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฑธ ์ ์ ์๋ค. ๋ชจ๋ฅด๋ ๊ฐ์ ์ซ์๋ฅผ ๋ํ๊ณ ๋นผ ๋ด์ผ ์ฌ์ ํ ์ ์ ์๋ ๊ฐ์ธ ๊ฒ์ด๋ค.
2) ๋น๊ต์ฐ์ฐ
์ด๋ฒ์๋ ๋น๊ต์ฐ์ฐ์ ์งํํด ๋ณด์. ์๋์ ๊ฐ์ ํ ์ด๋ธ์ ๋น๊ต์ฐ์ฐ์ ์ ์ฉํ๋ฉด:
A | B |
1 | 2 |
1 | NULL |
NULL | NULL |
A = B, A > B, A < B๋ฅผ ๊ฐ๊ฐ ์ ์ฉํ์ ๋ A < B์์ ๋ ๋ค ์ ์์ธ ๋ก์ฐ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ ์ธ์ ๋์ค๋ ๊ฒ ์๋ค. ๋์ฌ๊ฒจ๋ณผ ์ ์ 1๊ณผ NULL๋ฟ ์๋๋ผ NULL๊ณผ NULL๋ผ๋ฆฌ๋ ์ ๋๋ค๋ ์ ์ด๋ค. SQL์์ NULL ๊ฐ์ '์ ์ ์๋ ๊ฐ' ์ด๋ฏ๋ก ์ ์ ์๋ ๊ฐ ์ฌ์ด์ ๋น๊ต๋ ๋ถ๊ฐํ๋ค.
3) ์ง๊ณํจ์
์ด๋ฒ์ ์ง๊ณํจ์๋ค. ์๋ ํ ์ด๋ธ์ ์ง๊ณํจ์๋ฅผ ์ ์ฉํด ๋ณด๋ฉด:
์ฃผ๋ฌธ๋ฒํธ | ๊ตฌ๋งค๊ธ์ก |
10001 | 10000 |
10002 | 7000 |
10003 | NULL |
10004 | 2000 |
SELECT COUNT(*), COUNT(๊ตฌ๋งค๊ธ์ก), SUM(๊ตฌ๋งค๊ธ์ก), AVG(๊ตฌ๋งค๊ธ์ก), MAX(๊ตฌ๋งค๊ธ์ก), MIN(๊ตฌ๋งค๊ธ์ก)
FROM zipge;
COUNT(*) | COUNT(๊ตฌ๋งค๊ธ์ก) | SUM(๊ตฌ๋งค๊ธ์ก) | AVG(๊ตฌ๋งค๊ธ์ก) | MAX(๊ตฌ๋งค๊ธ์ก) | MIN(๊ตฌ๋งค๊ธ์ก) |
4 | 3 | 19000 | 6333.3333 | 10000 | 2000 |
์ฌ์น์ฐ์ฐ์์์ฒ๋ผ ์ถ๋ ฅ์ด ์์ ์ ๋๋ ๊ฒ ์๋๋ผ NULL๊ฐ์ ์๋์ผ๋ก ๋นผ๊ณ ์ด์ธ์ ๊ฐ์ ์ฐ์ฐํด ์ค๋ค. ๋ค๋ง, COUNT์ AVG๋ ์ฃผ์ํ ํ์๊ฐ ์์ด ๋ณด์ธ๋ค. ์๊ธฐ ์ฟผ๋ฆฌ์์ COUNT(*)์ COUNT(๊ตฌ๋งค๊ธ์ก)์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ฆฌํดํ๋ค. ์ฃผ๋ฌธ๋ฒํธ 10003์ ์ฃผ๋ฌธ๊ธ์ก์ด NULL์ด์ง๋ง ์ฃผ๋ฌธ๋ฒํธ๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฏ๋ก COUNT(*)์์๋ ๊ฐ์ผ๋ก ์ง๊ณ๋ ๊ฒ์ด๋ค. AVG์ ๊ฒฝ์ฐ์๋ ์ ์ฒด ๊ตฌ๋งค์ก์ธ 19000์ ํด๋น ์ปฌ๋ผ์์ NULL์ด ์๋ ๋ก์ฐ์ธ 3์ผ๋ก ๋๋ ๊ฐ์ผ๋ก ์ถ๋ ฅ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก SUM(๊ตฌ๋งค๊ธ์ก) / COUNT(*)์๋ ์๋ก ๋ค๋ฅธ ๋ต์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
NULL์ TRUE ์๋๋ฉด FALSE๋ก ์ค๋ช ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ
์ด์ฒ๋ผ SQL์ NULL์ ๊ฑธ๋ฌ๋ด๊ธฐ ์ํด ๊ธฐ์กด ์ธ์ด์์ ์ฌ์ฉ๋๋ TRUE, FALSE๋ก ์ด๋ฃจ์ด์ง 2๊ฐ ๋ ผ๋ฆฌ์ NULL์ ์ถ๊ฐํ 3๊ฐ ๋ ผ๋ฆฌ(Three-valued logic)๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ฒ์์ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค. "์ NULL์ =์ด ์๋๋ผ is๋ฅผ ์จ์ผ ํ ๊น."
๋ต๋ณ์ ์ด์ฏค ๋๊ฒ ๋ค. NULL์ TRUE๋ FALSE๋ก ์ค๋ช ๋ ์ ์๋ ์ 3์ ๊ฐ์ด๋ค. ๊ทธ๋์ NULL์ ๋น๊ต์ฐ์ฐ๋ ์ ์๋ค. ๋ง ๊ทธ๋๋ก ๋ชจ๋ฅด๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ SQL์ 'NULL์ TRUE๋ FALSE ๋ ๊ฐ์ง๋ก ๋น๊ต์ฐ์ฐํ ์ ์๋' ๋ฌธ๋ฒ์ ๋ง๋ค์๊ณ ์ด๊ฒ IS NULL๊ณผ IS NOT NULL์ด์์ ๊ฒ์ด๋ค.
์ฐธ๊ณ
1) https://khdscor.tistory.com/53
2) https://yoongaemii.github.io/null_in_sql/