Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

3.3.4.6 Работа с значениями NULL

К 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-значения всегда возвращались в первую очередь, вне зависимости от сортировки.

User Comments

Posted by Jon Gabrielson on December 18 2002 5:27pm[Delete] [Edit]


The function 'COALESCE' can simplify working with null
values.
for example, to treat null as zero, you can use:
select COALESCE(colname,0) from table where
COALESCE(colname,0) > 1;

in a date field, i used:
ORDER BY
(coalesce(TO_DAYS(date),TO_DAYS(CURDATE()))-TO_DAYS(CURDATE()))
to treat NULL as the current date.



Posted by Bob Kolk on January 10 2003 1:05pm[Delete] [Edit]

Use IFNULL() in your SELECT statement is make the NULL any value you wish.

IFNULL(expr1,expr2)
If expr1 is not NULL, IFNULL() returns expr1, else it returns expr2. IFNULL() returns a numeric or string value, depending on the context in which it is used:
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'

Posted by [name withheld] on April 30 2003 1:26pm[Delete] [Edit]

Null handling can be very counter intuitive, and could cause problems if you have an incorrect function in a delete statement that returns null

DELETE FROM my_table where field > NULL (or function returning NULL)

deletes all entries.

SELECT * FROM my_table WHERE field > NULL (or function returning NULL)

returns 0 entries!

Add your own comment.