SQL/Insights

' = NULL ' (X) ' IS NULL ' (O)

죵욜이 2024. 11. 12. 08:21

개요

프로그래머스 에 있는 SQL 문제를 풀다가 어이없는 실수를 하였다.

 

이 문제를 보고

SELECT ANIMAL_ID     # 틀린거임
FROM ANIMAL_INS
WHERE NAME = NULL

SELECT ANIMAL_ID     # 틀린거임
FROM ANIMAL_INS
WHERE NAME = "NULL"

이런식으로 생각을 하였는데 바로 며칠전에 IS [NOT] NULL 을 배우고도 바로 떠올리지 못한 내가 싫었다.

다른 언어에서는 NULL 값을 비교할때 비교연산자 ( = ) 를 사용하는 언어도 있지만 

왜 SQL 에선 다르지?? 라는 생각을 하게되었다.


 

SQL 에서의 NULL

SQL 에서  NULL  은 "아직 값이 할당되지 않은 상태" 를 나타내기 때문에 일반적인 값과는 다르게 취급된다.

 

NULL 에 대한 이해를 돕기위해 이곳저곳 찾아보다가 스택오버플로우 에서 재미있는 댓글을 하나 봤는데 이걸보면 이해가 빠를것이다.

 

  • Non-zero value (왼쪽 위): 화장지 롤이 가득 채워져 있습니다. 실제로 값이 할당된 상태를 나타냅니다. 예를 들어, 숫자 5나 문자열 "hello" 같은 값입니다.
  • 0 (오른쪽 위): 화장지 롤이 있지만 종이가 없습니다. 값은 있지만 그 값이 0인 상태를 나타냅니다.
  • null (왼쪽 아래): 화장지 롤이 아예 비어 있습니다. 값이 할당되지 않은 상태를 나타내며, 즉 변수는 있지만 값이 없는 상태입니다.
  • undefined (오른쪽 아래): 화장지 롤 자체가 존재하지 않습니다. 변수가 아예 선언되지 않은 상태를 의미합니다.

즉 데이터 값이 없다는 뜻인데 이러한 상황 때문에  NULL 이 정의되었다.

 

 

SQL 에선 이러한  NULL  을 처리하기위해  TRUE  FALSE  UNKNOWN  을 가지는 3가 논리( Three-Valued Logic ) 를 사용하는데

 Null == {특정값}  의 결과가  UNKNOWN  이기 때문에  TRUE  FALSE  를 기반으로 하는 논리연산에서 사용할 수 없는것이다.

 

따라서 특정 데이터가  NULL  인지 비교하기 위해선  TRUE  FALSE  로 반환하는 비교문이 필요한데,

이 비교문이 바로  IS NULL  IS NOT NULL  이다.

 

'SQL > Insights' 카테고리의 다른 글

범위지정 ( BETWEEN vs 비교연산자)  (0) 2024.11.06