개요
프로그래머스 에 있는 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 |
---|