Что делает delete from table where NULL = NULL
средний?
Это ничего не удалит из таблицы. NULL не равно NULL.
Теперь
удалить из таблицы, где NULL равно NULL
, удалит все строки из таблицы.
Это наказывает людей, у которых в базе данных ANSI_NULLS установлен на off :)
Это означает, что ничего не удаляйте, потому что NULL никогда ничему не равен. Или, может быть, это означает «не удаляйте ничего, если пользовательская СУБД действительно не отстой, и в этом случае удалите все назло».
Если серьезно, такая конструкция обычно возникает, когда предложение WHERE генерируется процедурно - вместо того, чтобы создавать специальный случай для «ничего не делать», иногда проще просто сгенерировать предложение WHERE, которое заставляет базу данных ничего не делать. . Я обычно видел «WHERE 0 = 1», что менее двусмысленно.
Поскольку NULL не равен NULL, это утверждение ничего не даст. Оно равно:
DELETE FROM TABLE WHERE 0
Я полагаю, что это зависит от базы данных, но, насколько мне известно, это не должно ничего дать, поскольку NULL никогда не равен NULL, по крайней мере, в теории db.
В SQL есть три логических значения, а именно ИСТИНА, ЛОЖЬ и НЕИЗВЕСТНО. когда мы сравниваем null с null, используя null = null, операция вернет UNKNOWN. Более того, в предложении WHERE все НЕИЗВЕСТНЫЕ значения отфильтровываются, поэтому запрос ничего не делает.
Recap:
mysql> select null = null, null <> null, null is null, null = 1, null <> 1;
+-------------+--------------+--------------+----------+-----------+
| null = null | null <> null | null is null | null = 1 | null <> 1 |
+-------------+--------------+--------------+----------+-----------+
| NULL | NULL | 1 | NULL | NULL |
+-------------+--------------+--------------+----------+-----------+
1 row in set (0.00 sec)
mysql> select count(*) from table;
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (0.33 sec)
mysql> select * from table where null;
Empty set (0.00 sec)
То есть, если условие оценивается в null, то MySql считает его ложным, поэтому delete from table where NULL = NULL
на самом деле ничего не удалит.
NULL - это особый зверь, как отметил Кодд