Вот простой пример, объясняющий это появление, которое также встречается в других СУБД, таких как SQL Сервер и Oracle.
. Предположим, что
select t2.email from `table2` t2
возвращает
+-------------+
| email |
+-------------+
| 111@abc.com |
| 222@abc.com |
| NULL |
+-------------+
При выполнении
SELECT * FROM `table1` t1 where t1.email not in (select t2.email from `table2` t2)
MySQL преобразует его в
SELECT * FROM `table1` t1
where
t1.email <> '111@abc.com' AND t1.email <> '222@abc.com' AND t1.email <> NULL
Предложение where
всегда возвращает NULL
, поскольку любое значение, сравниваемое с NULL
, возвращает NULL
и любое логическое значение, выполняющее AND
операцию с NULL
, также возвращает NULL
. Поэтому весь запрос SQL, как показано выше, всегда возвращает не запись.
Аналогично,
SELECT * FROM `table1` t1 where t1.email in (select t2.email from `table2` t2)
будет преобразовано в
SELECT * FROM `table1` t1
where
t1.email = '111@abc.com' OR t1.email = '222@abc.com' OR t1.email <> NULL
Значение t1.email <> NULL
равно NULL
, которое будет игнорироваться, если любое другое сравнение равно TRUE
.