데이터 베이스/SQL 첫걸음(인프런 강의)

Ch04. 조회와 정렬 - null

webmaster 2025. 10. 17. 22:54
728x90

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 정렬 규칙

결론부터 말하자면, MySQLNULL 가장 작은 값으로 취급한다. 이것만 기억하면 된다.

  • 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를 통해 순서를 조정한다.
    • 여기서는 내림차순으로 정렬했으므로 "ㅈ", "ㅊ", "ㅍ" 순서의 반대인 "ㅍ", "ㅊ", "ㅈ" 순서로 정렬되었다.

 

728x90