DB
[DB] 데이터베이스 관점에서 NULL
개바리여리
2025. 6. 19. 23:45
데이터베이스에서 NULL은 "값이 없다" 또는 **"알려지지 않았다"**는 의미를 가집니다.
즉, 0도 아니고, 빈 문자열도 아니며, 그냥 "모름" 또는 **"정의되지 않음"**을 의미
영희의 나이값이 NULL 이다
이것은 영희의 나이값이 없는것인데 0살이거나 "" 빈값이 아니라는 의미이다.
즉, 나이는 존재하지만 기록되지 않거나 아직 모르는 상태이다.
NULL의 특징
- 비교 불가
- NULL = NULL은 true가 아니라 **false 혹은 UNKNOWN**이에요.
- NULL은 "모름"이기 때문에 서로 비교할 수 없음.
- 비교하려면 반드시 IS NULL 또는 IS NOT NULL을 써야 해요.
2. 산술 연산 시 NULL
- 어떤 값에 NULL을 더하거나 곱하면 결과도 NULL이에요.
- 예: 100 + NULL → NULL
NULL이 성능이나 설계에 끼치는 영향
1. NULL은 인덱스에서 주의해야 함
- 일반적으로 B-Tree 인덱스는 NULL 값을 인덱싱하지만,
일부 DB에서는 NULL 값이 WHERE 조건에 따라 무시되기도 함.
SELECT * FROM users WHERE phone IS NULL;
위에 쿼리는 인덱스 적용이 안될 수도 있음.
2. NOT IN과 NULL
- NOT IN 조건에서 NULL이 있으면 전체 결과가 아예 비어버릴 수 있음.
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM orders);
만약 orders.user_id에 NULL이 포함되어 있으면 → 결과가 0건 나올 수도 있음
(왜냐면 NULL이 있으면 비교가 불확실하다고 판단됨)
아래 쿼리가 안전하게 치환한 것이다.
SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
3. NULL은 3값 논리 (Three-valued logic)
| TRUE AND NULL | UNKNOWN |
| FALSE OR NULL | UNKNOWN |
| NULL = NULL | UNKNOWN |
3-1. and 연산자
| A | B | A AND B |
| TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE |
| TRUE | NULL | UNKNOWN |
| FALSE | TRUE | FALSE |
| FALSE | FALSE | FALSE |
| FALSE | NULL | FALSE |
| NULL | TRUE | UNKNOWN |
| NULL | FALSE | FALSE |
| NULL | NULL | UNKNOWN |
3-2. OR 연산자
| A | B | A OR B |
| TRUE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| TRUE | NULL | TRUE |
| FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE |
| FALSE | NULL | UNKNOWN |
| NULL | TRUE | TRUE |
| NULL | FALSE | UNKNOWN |
| NULL | NULL | UNKNOWN |
3-3 NOT 연산
| A | NOT A |
| TRUE | FALSE |
| FALSE | TRUE |
| NULL | NULL |