이제 NULL에 대해 좀 더 자세히 얘기해볼 시간이야. 이게 그냥 아무 의미 없는 얘기가 아니야, 우리 주인공은... 아무것도 아닌 것처럼 보여도 말이지. 만약 테이블이 집이라면, NULL은 그 집의 유령 같은 존재야 — 조용하고, 수수께끼 같고, 예측 불가하지. 분명히 어딘가 있긴 한데, 질문에도 대답 안 하고, 계산에도 안 끼고, 비교도 피하지. 이건 단순히 "비어있음"이 아니라 "아무것도 모름"이야.
SQL 세계에서 NULL은 0도 아니고, 빈 문자열도 아니고, 우리가 흔히 생각하는 "데이터 없음"도 아니야. 이건 특별한 "모름"의 표시라서 조심해서 다뤄야 해. 오늘은 NULL이 단순히 이상한 손님이 아니라, 모든 데이터베이스에서 중요한 멤버인 이유를 알아볼 거야. 왜냐면 이건 진짜로 "값을 모름 또는 아직 정해지지 않음"을 의미하거든.
NULL이 빈 문자열이나 숫자 0이랑 뭐가 다를까?
많은 초보자들이 NULL을 빈 문자열 ''이나 숫자 0이랑 헷갈려 해. 핵심 차이점을 같이 보자:
| 개념 | 값 |
|---|---|
NULL |
값이 완전히 없음. 이건 그냥 빈 상자가 아니라, 상자 자체가 없는 거야 |
| 빈 문자열 | 그냥 아무 문자도 없는 문자열. 예시: '' |
숫자 0 |
0이라는 구체적인 숫자 값을 의미함 |
실생활 예시: 직원 테이블이 있다고 해보자, 그리고 거기에 월급을 저장해. 월급이 0이면, 그 사람은 돈을 하나도 못 받은 거야. 근데 월급이 NULL이면, 그냥 얼마 받는지 모르는 거야 (아니면 아직 정해지지 않았거나).
NULL을 어떻게 해석해야 할까
이제 NULL이 뭔지 조금 알았으니까, SQL에서 어떻게 다루는지 보자. NULL에 대해 제일 중요한 건 한 문장으로 말할 수 있어: NULL은 아무것과도 같지 않고, 아무것과도 다르지 않아, 심지어 자기 자신하고도.
SELECT NULL = NULL; -- 결과: FALSE
놀랍지? 왜 그럴까? NULL은 "모름"이기 때문이야. 모르는 값 두 개가 있으면, 그게 같은지 다른지 말할 수가 없어.
몇 가지 예시를 같이 보자:
NULL 연산 예시
SELECT NULL + 1; -- 결과: NULL
SELECT NULL * 100; -- 결과: NULL
SELECT NULL = 0; -- 결과: FALSE
SELECT NULL <> 0; -- 결과: FALSE
NULL은 더하기, 곱하기, 다른 계산을 해도 항상 NULL이 나와. 여기서 NULL은 0이랑은 완전 다르게 동작해. 뭔가를 허공에 던지면, 그 허공이 다 삼켜버리는 느낌이랄까.
실전 예시
students 테이블에 학생 정보가 있다고 해보자:
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
예시 1: 조건에서 NULL의 영향
생일이 없는 학생을 찾으려고 WHERE birth_date = NULL 조건을 쓰면:
SELECT *
FROM students
WHERE birth_date = NULL;
아무 결과도 안 나와. 왜냐면 NULL = NULL은 FALSE가 되거든. NULL을 체크하려면 IS NULL을 써야 해:
SELECT * FROM students WHERE birth_date IS NULL;
결과:
| id | name | birth_date | grade |
|---|---|---|---|
| 2 | Bob | NULL | 90 |
| 4 | Diana | NULL | NULL |
예시 2: 계산에서 NULL의 영향
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
모든 학생의 평균 점수를 계산해보면:
SELECT AVG(grade) FROM students;
결과는 87.5가 나와. 왜냐면 NULL은 AVG, SUM, MIN, MAX 같은 집계 함수에서 무시되거든. 하지만 조심해야 해! NULL이 있는 행도 포함해서 뭔가 하려면 추가 작업이 필요해.
NULL을 다루는 방법은 다음 강의에서 더 자세히 배울 거야.
GO TO FULL VERSION