NULL 비교
SELECT * FROM products WHERE description = NULL

- 실행결과는 없다.
- 분명 보급형 스마트폰의 description 값은 NULL이기 때문에 조회가 될 것으로 기대했는데, 기대와는 다르게 아무 상품도 조회되지 않았다.
NULL 연산 - 알 수 없음
데이터베이스에서 '값이 없음'을 나타내는 특별한 상태를 NULL이라고 한다. NULL은 숫자 0이나 빈 문자열( '' )과는 완전히 다른 개념이다. 말 그대로 '알 수 없는 값', '존재하지 않는 값'이다.
상품 설명이 비어있는 상품을 찾기 위해 WHERE description = NULL이라고 쓰면 될까? 절대 안 된다. NULL은 특정 값이 아니기 때문에 등호(= )로 비교할 수 없다.
SQL에서 NULL이 '값이 없는 상태'를 의미하는 특별한 존재이기 때문이다. `NULL` 은 0도 아니고, 공백 문자열('')도 아니다. 알 수 없는 값이라는 개념에 가깝다
NULL은 '빈 상자'가 아니라 '상자가 있는지조차 모른다'는 표시다.
- price=0 : 숫자가 0이라는 값이 있다.
- description='' : 글자가 없다는 값이 있다. (두 쉼표가 사용되었다.)
- NULL : 값이 있는지 자체를 모른다.
따라서 어떤 값 = NULL이라는 비교 연산은 항상 '알 수 없음(UNKNOWN)'이라는 결과를 반환한다. NULL = NULL 조차도 참 TRUE)이 아닌 '알 수 없음(UNKNOWN)'이다. 비교는 양쪽이 다 값을 가질 때만 참 거짓을 결정할 수 있다. WHERE 절은 조건의 결과가 '참(TRUE)'인 행만 반환하므로, '알 수 없음(UNKNOWN)'으로 판별된 행은 결과에 포함시키지 않는다.
이런 문제를 해결하기 위해 SQL은 IS NULL이라는 특별한 키워드를 제공한다. NULL인지 아닌지를 검사하기 위해서는 반드시 IS NULL또는 IS NOT NULL을 사용해야 한다.
- IS NULL: 해당 열의 값이 NULL인 행을 찾는다.
- IS NOT NULL : 해당 열의 값이 NULL이 아닌, 즉 데이터가 입력된 행을 찾는다.
실습 1) products 테이블에서 상품 설명(description)이 없는(NULL) 상품 조회하기
select *
from products
where description is null;

실습 2) 설명이 있는상품만 찾는다.
select *
from products
where description is not null;

NULL 정렬
MySQL의 NULL 정렬 규칙
결론부터 말하자면, MySQL은 NULL을 가장 작은 값으로 취급한다. 이것만 기억하면 된다.
- ORDER BY column ASC(오름차순): NULL 값이 가장 먼저 나온다. (가장 작은 값으로 취급되므로)
- ORDER BY column DESC(내림차순): NULL 값이 가장 나중에 나온다. (가장 작은 값이라 맨 아래로 밀려나므로)
이것은 데이터베이스 시스템마다 정책이 다를 수 있으므로(Oracle은 NULL을 가장 큰 값으로 취급한다), 내가 사용하는 DB가 어떤 규칙을 따르는지 명확히 아는 것이 중요하다.
실습 1) description 열을 오름차순으로 정렬하기
select *
from products
order by description;

- NULL 값은 가장 작은 값이다. 예상대로 description이 NULL인 '보급형 스마트폰'이 가장 먼저 나왔다.
- description ASC로 정렬했으므로 "ㅈ", "ㅊ" , "ㅍ" 순서로 정렬된다.
실습 2) description 열을 내림차순으로 정렬하기
select *
from products
order by description desc;

- 내림차순으로 정렬하니, 가장 작은 NULL 값이 가장 마지막에 위치하는 것을 확인할 수 있다.
- description DESC로 정렬했으므로 "ㅈ" , "ㅊ" , "ㅍ" 순서의 반대인 "ㅍ", "ㅊ", "ㅈ" 순서로 정렬된다.
NULL 위치를 강제로 바꾸고 싶을 때
"상품 설명을 내림차순으로 정렬하되, 설명이 없는 상품(`NULL` )은 빨리 확인할 수 있게 맨 앞으로보내주세요."와같이 기본 동작과 다른 요구사항이 종종 있다. 이럴 때는 어떻게 할까?
select product_id, name, description, description is null
from products
order by description desc;

- description IS NULL 필드를 확인해 보자. description IS NULL 조건에 만족하는 경우에는 1을 반환한다. 나머지는 0을 반환한다.
- description DESC로 정렬했으므로 "ㅈ", "ㅊ", "ㅍ" 순서의 반대인 "ㅍ", "ㅊ", "ㅈ" 순서로 정렬된다.
select product_id, name, description, description is null
from products
order by description is null desc, description desc;

- description IS NULL을 정렬 조건에 사용했다.
- description IS NULL DESC을 첫 번째 정렬 조건으로 description DESC을 두번째 정렬 조건으로 사용한다.
- 1순위인 description IS NULL에서 보급형 스마트폰의 값만 1이다. 따라서 가장 상단에 출력된다.
- 나머지 값들은 description IS NULL의 값이 모두 0이다. 1순위 값이 0으로 같으므로 2순위인 description DESC를 통해 순서를 조정한다.
- 여기서는 내림차순으로 정렬했으므로 "ㅈ", "ㅊ", "ㅍ" 순서의 반대인 "ㅍ", "ㅊ", "ㅈ" 순서로 정렬되었다.
'데이터 베이스 > SQL 첫걸음(인프런 강의)' 카테고리의 다른 글
| Ch04. 조회와 정렬 - Distinct (0) | 2025.10.17 |
|---|---|
| Ch04. 조회와 정렬 - Limit (0) | 2025.10.17 |
| Ch04. 조회와 정렬 - order by (0) | 2025.10.17 |
| Ch04. 조회와 정렬 - where (0) | 2025.10.17 |
| Ch04. 조회와 정렬 - Select(조회) (0) | 2025.10.13 |