NULL
Работа с неопределенными значениями
Теория
Например:
• у работника зарплата пока не внесена в систему;
• у заказа ещё нет даты отгрузки;
• в анкете человек не указал телефон.
Во всех этих случаях в базе может стоять NULL. Это не ошибка и не специальный текст. Это отдельное неопределенное состояние данных.
Из-за этого с NULL нельзя обращаться как с обычным значением. Его нельзя корректно искать через = NULL или != NULL. Для проверки существуют специальные конструкции IS NULL и IS NOT NULL.
Синтаксис
SELECT column1, column2
FROM table_name
WHERE column IS NULL;
SELECT column1, column2
FROM table_name
WHERE column IS NOT NULL;
SQL
Важно: записи = NULL и != NULL здесь не работают. SQL не считает NULL обычным значением для сравнения, поэтому для него нужны отдельные операторы. Резюме: нельзя сравнивать определенное значение с неопределенным используя обычные операторы сравнения.
Ещё одна важная мысль: NULL и '' — не одно и то же. Пустая строка — это значение, просто пустое. NULL — это отсутствие значения вообще.
Примеры
1. Находим пользователей, у которых не указан город
🔄 Попробуйте изменить запрос:
- • Поменяйте IS NULL на IS NOT NULL
- • Добавьте сортировку по имени: ORDER BY first_name ASC
2. Показываем 3 последних заказа, у которых не указан статус
🔄 Попробуйте изменить запрос:
- • Поменяйте условие на status IS NOT NULL
- • Уберите LIMIT 3 и посмотрите все заказы без статуса
3. Оставляем только товары, у которых категория заполнена
🔄 Попробуйте изменить запрос:
- • Поменяйте условие на category IS NULL и посмотрите только товары без категории
- • Добавьте сортировку по цене: ORDER BY price DESC
4. Смотрим, почему = NULL не работает
🔄 Попробуйте изменить запрос:
- • Замените IS NULL на = NULL и посмотрите, что результат станет пустым
- • После этого верните правильную запись IS NULL и сравните результат ещё раз
Типичные ошибки
Пишут = NULL вместо IS NULL
Запрос вида WHERE salary = NULL не найдёт нужные строки. Для проверки на отсутствие значения нужно писать WHERE salary IS NULL.
Пишут != NULL вместо IS NOT NULL
Чтобы оставить только заполненные значения, нужен оператор IS NOT NULL. Сравнение через != NULL для этого не подходит.
Путают NULL и пустую строку
'' — это значение, хоть и пустое. NULL — это отсутствие значения. Поэтому проверка WHERE column IS NULL не найдёт строки, где в колонке лежит ''.
Считают, что NULL — это то же самое, что 0
Ноль — это обычное числовое значение. NULL — это информация о том, что значения нет. У этих двух состояний разный смысл, и их нельзя смешивать.
Забывают, что NULL по-особому ведёт себя в сортировке
В PostgreSQL положение NULL зависит от направления сортировки. При ORDER BY salary ASC пустые значения обычно окажутся в конце, а при ORDER BY salary DESC — в начале. Если порядок важен, задавайте его явно через NULLS FIRST или NULLS LAST.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал: