SQL에서 NULL
비교 시, = NULL
이 아닌 IS NULL
, IS NOT NULL
을 사용해야 합니다. 일반적인 프로그래밍 언어의 NULL
비교문(= NULL
)과 다르다는 것은 프로그래밍 언어와 SQL의 NULL 비교 연산이 다르다는 것을 의미합니다.
이 글은 프로그래밍 언어(C, Java)와 SQL에서 NULL
비교가 어떻게 다른지를 설명합니다.
NULL
비교대부분 프로그래밍 언어는 TRUE
, FALSE
의 값을 가지는 2값 논리를 사용합니다. 따라서 비교 연산 시 TRUE
, FALSE
두 값만 결과로 확인할 수 있습니다.
C에서 NULL
은 0인 주소값을 의미합니다. 따라서 NULL
을 가진 값과 0을 비교 연산하면 TRUE
가 나옵니다.
Java에서 null
은 참조 객체가 어떤 객체나 메모리 주소도 가리키지 않음을 의미합니다.
The Java Virtual Machine does not mandate a concrete value for null.
JVM Spec에 따르면 JVM은 null
에 구체적인 값을 요구하지 않는다고 합니다. null이 어떤 값을 가지는지 모르고, 자바는 비교 시 타입 체크에 매우 엄격하므로 C처럼 특정 값과 null을 비교할 수 없습니다.
NULL
비교SQL에서 NULL
은 데이터 값이 없다는 것을 의미하는 키워드입니다. 데이터베이스에서 값이 존재하지 않는다는 사실은 굉장히 중요합니다. 이 요구사항을 만족시키기 위해 NULL
이 정의되었습니다.
SQL은 NULL
을 처리하기 위해 TRUE
, FALSE
, UNKNOWN
을 가지는 3가 논리(three-valued logic)를 사용합니다. NULL
과 특정값을 비교하면 항상 UNKNOWN
이 나와, 개발자가 NULL
과 관련된 연산이라는 것을 알 수 있습니다. 이렇게 하면 실수로 NULL
을 잘못 처리하는 것을 방지할 수 있습니다.
Null == {특정값}
의 결과가 UNKNOWN
이기 때문에, TRUE
, FALSE
를 기반으로 하는 논리 연산에서 이 구문을 사용할 수 없습니다. 따라서 특정 데이터가 NULL
인지를 TRUE
, FALSE
로 반환하는 비교문이 필요합니다. 이것이 바로 IS NULL
, IS NOT NULL
입니다.
SQL spec 문서(SQL-92)에 따르면 TRUE
, FALSE
를 반환하는 NULL
비교 구문은 다음과 같습니다.
<null predicate> ::= <row value constructor> IS [ NOT ] NULL
프로그래밍 언어(C, Java)의 NULL
비교
프로그래밍 언어는 TRUE, FALSE 논리 연산을 사용하므로 NULL 비교 시 TRUE, FALSE 결과만 나옴.
SQL의 NULL
데이터 값이 없다는 것을 의미하는 키워드
SQL의 NULL
비교
SQL은 3가 논리(TRUE, FALSE, UNKNOWN)을 사용하는데,
NULL == {특정값}
은 UNKNOWN이므로,
NULL 비교 시 TRUE, FALSE를 반환하기 위해IS [NOT] NULL
정의
정리하신 글 잘 읽었습니다. 차근차근 설명해 주셔서 이해가 잘 되네요. 감사합니다!