💡 핵심 인사이트
데이터베이스에서 NULL은 숫자 0(Zero)이나 빈 공백 문자열("")과는 완전히 차원이 다른 개념입니다.
NULL은 **"아직 값을 알 수 없다(Unknown)", "해당 사항이 없다(Inapplicable)", 혹은 "입력되지 않았다"를 수학적으로 나타내는 특수한 마커(Marker)**입니다.
Ⅰ. NULL의 본질과 등장 배경
테이블에 데이터를 넣다 보면 아직 정보를 모르는 경우가 생깁니다.
예를 들어 신입사원의 데이터를 넣는데, 아직 전화번호가 개통되지 않았습니다. 이때 전화번호 컬럼에 강제로 숫자 0을 넣으면 "이 사람 전화번호는 0번이구나"라고 시스템이 착각하게 됩니다.
스페이스바를 쳐서 공백(" ")을 넣어도 마찬가지로 빈 문자열이라는 '데이터'가 들어가 버립니다.
이렇게 '데이터 부재 상태' 자체를 명확히 표현하기 위해 에드가 코드가 고안한 것이 바로 **NULL(널)**입니다. "이 칸은 아예 비어있다"는 뜻입니다.
Ⅱ. NULL 연산의 치명적인 함정 (3치 논리)
NULL은 숫자가 아니기 때문에 산술 연산이나 비교 연산에 들어가면 모든 결과를 집어삼켜 버립니다. 일반 프로그래밍과 DB SQL의 가장 큰 차이점이 여기서 나옵니다.
1. 산술 연산 (NULL의 전염성)
100 + NULL=NULLNULL * 10=NULL- 모르는 값에 100을 더해봐야 그 결과도 "모르는 값"일 수밖에 없습니다. 연산식에 NULL이 하나라도 끼어 있으면 결과는 무조건 NULL이 됩니다.
2. 비교 연산과 3치 논리 (Three-Valued Logic)
일반 논리학은 참(True)과 거짓(False) 2가지만 있지만, SQL은 NULL 때문에 **'알 수 없음(Unknown)'**이라는 제3의 상태를 가집니다.
A = 10➔ A가 10이면 True, 5면 False.NULL = 10➔ Unknown (알 수 없음). NULL이 10인지 아닌지 알 길이 없으므로 결과를 낼 수 없습니다.NULL = NULL➔ Unknown. 심지어 두 NULL끼리 비교해도 참(True)이 나오지 않습니다! 모르는 값과 모르는 값이 같은지 알 수 없기 때문입니다.
3. 올바른 NULL 검색 방법
위의 특성 때문에 SQL에서 널 값을 찾을 때는 등호(=)를 쓰면 아무것도 나오지 않습니다.
- ❌ 틀린 쿼리:
SELECT * FROM EMP WHERE COMM = NULL;(결과 0건 나옴) - ✅ 맞는 쿼리:
SELECT * FROM EMP WHERE COMM IS NULL;(IS NULL또는IS NOT NULL이라는 전용 연산자를 써야만 찾을 수 있습니다.)
Ⅲ. 집계 함수(Aggregate Function)와 NULL
SUM,AVG,MAX,MIN같은 그룹 집계 함수들은 똑똑하게도 NULL인 행은 아예 무시(건너뜀)하고 계산합니다. (예: 3명의 점수가 100, 50, NULL일 때 평균은 150/3이 아니라 150/2 = 75가 됩니다.)- 단,
COUNT(*)는 NULL을 포함한 전체 행의 개수를 세고,COUNT(컬럼명)은 그 컬럼에 NULL이 아닌 값이 들어있는 행만 셉니다.
📢 섹션 요약 비유: 숫자 0은 내 통장 잔고가 **'0원'**이라는 확정된 비극적 사실(데이터)이고, NULL은 은행 앱이 고장 나서 내 통장 잔고가 얼만지 아예 **'조회가 안 되는 알 수 없는 먹통 상태'**를 의미합니다. 조회가 안 되는 상태(NULL)에 100만 원을 더 입금해 봤자(산술 연산), 앱 화면은 여전히 먹통(NULL)일 뿐입니다.