B.3.4.3 Проблемы со значениями NULL
Понятие значения NULL является распространенной причиной путаницы для новичков в SQL, которые часто думают, что NULL — это то же самое, что и пустая строка ''. Это не так. Например, следующие операторы совершенно разные:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
Оба оператора вставляют значение в столбец phone, но первый вставляет значение NULL, а второй — пустую строку. Значение первого можно рассматривать как “номер телефона неизвестен”, а значение второго — как “известно, что у человека нет телефона, и, следовательно, нет номера телефона.”
Для облегчения работы с NULL можно использовать операторы IS NULL и IS
NOT NULL, а также функцию IFNULL().
В SQL значение NULL никогда не равно истинному значению при сравнении с любым другим значением, даже NULL. Выражение, содержащее NULL, всегда возвращает значение NULL, если иное не указано в документации для операторов и функций, участвующих в этом выражении. Все столбцы в следующем примере возвращают NULL:
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
Чтобы найти значения столбцов, являющиеся NULL, нельзя использовать проверку expr = NULL. Следующий оператор не возвращает строк, поскольку expr =
NULL никогда не равно истинному для любого выражения:
mysql> SELECT * FROM my_table WHERE phone = NULL;
Чтобы найти значения NULL, необходимо использовать проверку IS NULL. Следующие операторы показывают, как найти NULL номер телефона и пустой номер телефона:
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
Дополнительную информацию и примеры см. в разделе 3.3.4.6 «Работа со значениями NULL».
Можно добавить индекс к столбцу, который может содержать значения NULL, если используется хранилище данных MyISAM, InnoDB или MEMORY. В противном случае необходимо объявить столбец индекса NOT NULL, и нельзя вставлять NULL в этот столбец.
При чтении данных с помощью LOAD
DATA, пустые или отсутствующие столбцы обновляются значением ''. Чтобы загрузить значение NULL в столбец, используйте \N в файле данных. В некоторых случаях также можно использовать литеральное слово NULL. См. раздел 13.2.6, «Запрос LOAD DATA».
При использовании DISTINCT, GROUP
BY или ORDER BY все значения NULL считаются равными.
При использовании ORDER BY значения NULL выводятся первыми, или последними, если вы указали DESC для сортировки в порядке убывания.
Агрегатные (групповые) функции, такие как COUNT(), MIN() и SUM(), игнорируют значения NULL. Исключением является COUNT(*), которая считает строки, а не отдельные значения столбцов. Например, следующий оператор выводит два подсчета. Первый — это подсчет строк в таблице, а второй — подсчет значений, не являющихся NULL, в столбце age:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
Для некоторых типов данных MySQL обрабатывает значения NULL особым образом. Например, если вы вставите NULL в столбец целых чисел или с плавающей точкой, у которого есть атрибут AUTO_INCREMENT, вставляется следующее число в последовательности. В определенных условиях, если вы вставите NULL в столбец TIMESTAMP, вставляется текущая дата и время; это поведение частично зависит от режима SQL сервера (см. раздел 5.1.10 «Режимы SQL сервера»), а также от значения системной переменной explicit_defaults_for_timestamp.
© 2025 Oracle
Licensed under the GPLv2 License.