
SQL IN절에서 NULL이 예상대로 동작하지 않는 이유Computer Science/데이터베이스2024. 11. 29. 20:55
Table of Contents
SQL쿼리를 사용할 때 IN절에 NULL 값이 들어가면 안된다.
IN절은 WHERE 절의 조건에 맞는 각 행의 칼럼 값이 IN절 안의 값 중 하나와 일치할 때 행을 반환하는 연산자이다.
IN절에 NULL이 포함되었을 때
다음과 같은 students
테이블을 생성해 데이터를 확인해 보자
CREATE TABLE students(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
score INT
);
모든 데이터를 조회하는 쿼리
SELECT * FROM students;
결과
이제 score
가 100
또는 NULL
인 데이터를 조회하기 위해 다음과 같은 쿼리를 작성했다.
SELECT * FROM students WHERE score IN (100, null);
결과
하지만 기대와 다르게 score가 100인 행만 반환되고, NULL인 행은 조회되지 않았다.
SQL에서 NULL을 인지하는 방식
SQL에서 NULL
은 어떠한 값이 아니라 값이 없다는 의미이다. 즉 어떠한 값과도 비교할 수 없다.NULL
을 포함한 모든 비교 연산 결과는 TRUE
, FALSE
대신 UNKNOWN
으로 평가된다.
NULL 숫자 비교
SELECT NULL=1;
결과
NULL과 NULL 비교
SELECT NULL=NULL;
결과
NULL
은 값이 아니기 때문에 동일한 NULL
끼리도 비교할 수 없습니다.
그래서 이 쿼리는 반환값이 존재하지 않는다.
NOT IN 절과 NULL
그렇다면 NOT IN
절에 NULL
을 포함하면 어떻게 될까?NULL
이 아닌 값을 조회하니까 score
의 값을 가진 행들이 조회될까?
NOT IN 절에 NULL만 포함된 경우
SELECT * FROM students WHERE score NOT IN(NULL);
결과
이 경우 모든 행이 FALSE
또는 UNKNOWN
으로 평가되므로 아무것도 반환되지 않습니다.
NOT IN에 다른 값과 함께 NULL이 포함된 경우
SELECT * FROM stuents WHERE score NOT IN (100,90, NULL);
결과
NULL이 포함된 순간 모든 비교가 불가능하다.
score가 100이나 90이 아닌 행이라도 NULL로 인해 결과가 반환되지 않는다.
NULL 값을 조회하고 싶다면 어떻게 할까?
NULL
은 일반적인 값이 아니므로, IS NULL
또는 IS NOT NULL
조건을 사용해야 한다.
올바른 쿼리
SELECT * FROM students WHERE score IN (100,90) OR score IS NULL;
결과
결론
IN절에 NULL을 사용하면 의도한 결과가 나오지 않는다.
NULL 체크가 필요할 때는 반드시 IS NULL 혹은 IS NOT NULL을 사용하자
'Computer Science > 데이터베이스' 카테고리의 다른 글
MySQL ONLY_FULL_GROUP_BY 이해하기 (1) | 2024.12.11 |
---|---|
COUNT 함수와 SUM 함수의 차이점 (0) | 2024.12.01 |
MySQL에서 날짜 차이 계산하는 방법 (0) | 2024.11.30 |
MySQL에서 SELECT 별칭은 GROUP BY, ORDER BY, HAVING 절에서 사용 가능하다 (0) | 2024.11.28 |
MySQL은 문자열 대소문자 구분을 하지 않는다. (0) | 2024.11.25 |
@nuheajiohc :: nuheajiohc
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!