Понятие значения NULL является наиболее распространенным источником заблуждения для новичков в SQL, которые часто думают, что NULL - это то же самое, что и пустая строка ' ' .
Это совершенно не верно. Например, следующие операторы абсолютно разные:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my^table (phone) VALUES ( " ) ;
Оба оператора вставляют значение в столбец phone, но первый из них вставляет значение NULL, а второй - пустую строку. Смысл первого можно рассматривать как "номер телефона не известен", а смысл второго - как "известно, что у этого человека нет теле- фона, а, следовательно, у него нет и номера телефона". С обработкой NULL помочь могут операции IS NULL и NOT NULL, а также функция IFNULLO.
В SQL значение NULL никогда не бывает истинным при сравнении с любым другим значением и даже со значением NULL. Выражение, которое содержит NULL, всегда выдает значение NULL, если только в документации по операциям и функциям, задействованным в таком выражении, не было указано какое-нибудь другое значение. В следующем примере все столбцы возвращают NULL:
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible1,NULL);
Для поиска в столбцах значений NULL использовать критерий выражение - NULL нельзя. Следующий оператор не возвращает никаких строк, поскольку выражение = 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 = ' ' ;
Добавлять индекс для столбца, наличие значений NULL в котором не исключено, можно при условии, что используется версия MySQL 3.23.2 или выше, а также механизм хранения My ISAM, innoDB или BDB. Начиная с MySQL 4.0.2, механизмом хранения MEMORY также поддерживаются значения NULL в индексах. Во всех остальных случаях потребуется объявлять индексированные таблицы с помощью NOT NULL, а также вставить NULL в столбец будет невозможно. При считывании данных с помощью LOAD DATA INFILE пустые или недостающие столбцы обновляются со значениями ''. Если нужно в столбец занести значение NULL, используйте \N в файле данных. В определенных обстоятельствах также может использоваться и литеральное слово "NULL".
При применении DISTINCT, GROUP BY или ORDER BY все значения NULL рассматриваются как равные.
Агрегатные (итоговые) функции, такие как COUNT (), MIN() и SUMO, игнорируют все значения NULL. Исключение составляет функция COUNT (*), которая подсчитывает строки, а не отдельные значения в столбцах. Например, следующий оператор выполняет два типа подсчета. Сначала подсчитывается число строк в таблице, а затем - количество неравных NULL значений в столбце age:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
Для некоторых типов столбцов MySQL обрабатывает значения NULL специальным образом. При вставке NULL в столбец TIMESTAMP в него добавляются значения текущей даты и времени. При вставке NULL в столбец целых чисел с атрибутом AUTO_INCREMENT вставлено будет следующее число в последовательности.
Комментарии