Работа операторов !=, <> и IS NOT NULL с NULL в SQL
Быстрый ответ
В SQL NULL обозначает отсутствие значения. По этой причине любое сравнение с применением операторов неравенства: <>
или !=
всегда возвращает false, поскольку мы не можем сравнивать неизвестное и четко заданное значение. Проверка наличия или отсутствия значения в случае работы с NULL достигается с помощью формулировок IS NULL или IS NOT NULL:
-- Выбор строк, в которых значение в заданной колонке не NULL
SELECT *
FROM your_table
WHERE your_column IS NOT NULL;
Таким образом, вы сможете эффективно проверить представленные в колонке данные на предмет их наличия или отсутствия.
Глубокое понимание работы с NULL в SQL
Философия понимания NULL
Важно осознавать, что в рамках SQL NULL символизирует неопределенность. Он не равен нулю, пустой строке или даже другому NULL. Именно поэтому стандартные операторы сравнения неприменимы при работе с NULL. Сравнивать заданное значение с NULL — всё равно что сравнивать яблоки с неизвестностью.
Оптимальная работа с NULL
Параметр ANSI_NULLS в SQL Server влияет на поведение операторов !=
и <>
при операциях с NULL. Однако следует помнить, что Microsoft планирует в будущем отказаться от этой функциональности. Поэтому подход к работе с NULL может в последующем значительно измениться.
Учет NULL при операциях с данными
Применение функции ISNULL позволяет удобно обрабатывать NULL и пустые строки, предоставляя возможность замены NULL на необходимое значение:
-- Обработка NULL, с заменой на пустую строку
SELECT *
FROM your_table
WHERE ISNULL(your_column, '') != 'some_value';
Точное сравнение с NULL
Для более строго условия сравнения можно использовать выражение IS DISTINCT FROM, при этом считается, что два NULL значения представляют собой равноправные элементы:
-- Запрос, при котором NULL рассматривается как идентичное NULL и отличное от других значений
SELECT *
FROM your_table
WHERE your_column IS DISTINCT FROM 'some_value';
В результате этого запроса будут возвращены строки, в которых your_column
или NULL, или не содержит 'some_value', исключая потенциальные проблемы, возникающие при работе с NULL.
Визуализация
Представьте NULL как таинственный ящик (📦🌫️), операторы <>
и !=
— как неподходящие ключи (🔑1, 🔑2):
Сравнение с NULL (📦🌫️) с использованием ключей:
- `<>` (🔑1)
- `!=` (🔑2)
Поскольку NULL – это неопределенность, предложенные ключи не годятся:
Попытки открыть 🔑1: 📦🌫️ = ❓ (Нет, результат неизвестен.)
Попытки открыть 🔑2: 📦🌫️ = ❓ (Также не удается, тайну не раскрыть.)
В SQL-диалекте эти ключи не способны раскрыть тайну NULL, поскольку он есть воплощение "неизвестного".
Практическая работа с NULL
NULL и пустые строки
Важно провести грань между ситуациями, когда данные отсутствуют (NULL), и когда данные предствавляют собой пустые строки. NULL – таковым и является, а не пустой строкой.
NULL и агрегирующие функции
NULL игнорируется большинством агрегирующих функций, вроде SUM()
or COUNT()
. Для того чтобы такие данные были корректно включены в результат, применяйте функции замены для NULL, например, ISNULL.
NULL и операции со множествами
При выполнении операций с множествами, таких как JOIN
или WHERE EXISTS
, NULL может привести к нежеланным последствиям. Обеспечьте четкое управление NULL в вашем SQL-запросе, чтобы минимизировать неожиданные результаты.
Полезные материалы
- SQL NULL Values — IS NULL and IS NOT NULL — детальное описание, как образуются значения NULL в SQL.
- Modern SQL: IS DISTINCT FROM — расшифровка стандарта ANSI SQL на примере работы с двух NULL значений как равнозначных с помощью оператора IS DISTINCT FROM.
- Comparison Operators (Transact-SQL) — SQL Server | Microsoft Learn — официальная документация Microsoft, посвященная операторам сравнения в T-SQL, в том числе и работе с NULL.
- PostgreSQL: Documentation: 9.2. Comparison Functions and Operators — подробная документация PostgreSQL по функциям сравнения и операторов, с учетом NULL.
- MySQL :: MySQL 8.0 Reference Manual :: Working with NULL Values — официальное руководство пользователя MySQL, посвященное работе с NULL в SQL-запросах.
- SQL NOT NULL Constraint — простое руководство по использованию ограничения NOT NULL в SQL.