К NULL-значениям нужно привыкнуть. По идее, NULL обозначает отсутствующее
или неизвестное значение и обрабатывается отличным от других значений
образом. Проверить значение на равенство NULL с помощью обычных
арифметических операторов сравнения (=, < или <>) нельзя. Это отлично
иллюстрирует следующий запрос:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+
Очевидно, что от таких сравнений значащих результатов ожидать нечего.
Вместо этого нужно пользоваться операторами IS NULL и IS NOT NULL:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+
Отметим: в MySQL 0 или NULL приравнивается к логическому false, а все остальное - к
true. По умолчанию значение "истина" для булевого оператора равно 1.
Именно из-за того, что при работе с NULL действуют особые правила, в
предыдущем разделе для поиска умерших животных использовалось выражение
death IS NOT NULL, а не death <> NULL.
Два NULL-значения считаются одинаковыми в GROUP BY.
При выполнении ORDER BY, NULL-значения идут в первую очередь если вы выполняете
ORDER ... ASC и в последнюю - если ORDER BY ... DESC.
Обратите внимание, что в MySQL 4.0.2 - 4.0.10, NULL-значения всегда возвращались в первую
очередь, вне зависимости от сортировки.