[MySQL] == NULL 값 조회 안되는 이슈
MySQL
쿼리문을 작성할 때 필드 값이 NULL
인 Row를 조회하고 싶을 때가 있다.
근데 아무 생각 없이
1
SELECT * FROM your_table WHERE your_field = NULL
이라고 썼더니 조회가 안된다.
결론부터 이야기하자면
1
SELECT * FROM your_table WHERE your_field IS NULL
NULL
은 요런식으로 IS
혹은 IS NOT
문을 사용해서 조회해야한다.
이제부터 그 이유를 알아보자.
MySQL에서 NULL의 의미
NULL은 놓친 알 수 없는 값
을 의미한다. 그리고 NULL은 다른 값들과는 다르게 대우된다.
NULL을 테스트 해보기 위해서 IS NULL
과 IS NOT NULL
을 아래와 같이 실행해보면
1
2
3
4
5
6
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
이렇게 나온다.
아래의 테스트에서 볼 수 있듯이 수학적인 기호
(=, <, <>) 이런 것들은 쓸 수가 없다.
<> 는 not equal을 의미한다.
1
2
3
4
5
6
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
왜 NULL에는 수학적 기호를 사용하지 못할까?
왜나하면 NULL의 수학적 비교 값은 여전히 NULL
이기 때문이다.
이러한 비교를 통해서는 여전히 어떠한 의미있는 값을 얻을 수가 없다.
MySQL에서는 0 혹은 NULL은 false를 의미하고 다른 값들은 true를 의미한다.
boolean 연산에서 기본적인 true 값은 1이다.
일반적인 에러는 NOT NULL인 칼럼에 0
혹은 빈 문자열 ''
이 못들어간다고 생각하는데 그렇지 않다. NULL은 값이 없다
라는 의미이긴 하지만 사실 값은 값이다…
1
2
3
4
5
6
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+
-> 조금 말이 어렵긴한데,,,(NULL에 대해서는 꽤 많은 문제점들이 시사되고 있다.) 어쨌든 NULL에다가 수학적 비교를 하게 되면 그 값 또한 NULL이 되기 때문에 WHERE 문에서 적용이 안된다. 따라서 IS NULL
혹은 IS NOT NULL
과 같은 구체적인 비교 구문으로 값을 찾아야한다.
원문 참조 : https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html