Работа с NULL-значениями в выборках MySQL: случай '!='C'
Быстрый ответ
Для проверки значения на равенство NULL
используйте конструкции IS NULL
или IS NOT NULL
. Если вам нужно считать NULL равным самому себе при сравнении, применяйте оператор <=>
. Чтобы заменить NULL на значение по умолчанию, воспользуйтесь функцией COALESCE()
.
Пример:
-- Обнаружение значений столбца, равных NULL
SELECT * FROM таблица WHERE столбец IS NULL;
-- Сравнение столбца с NULL с учётом NULL-значений
SELECT * FROM таблица WHERE столбец <=> NULL;
-- Замена значений столбца NULL на альтернативное значение
SELECT * FROM таблица WHERE COALESCE(столбец, 'значение_по_умолчанию') = 'ожидаемое_значение';
Нюансы работы с NULL
Особенности поведения NULL
В MySQL NULL
обозначает отсутствие конкретного значения, это делает стандартное сравнение с помощью =
или !=
неприменимым, так как NULL нельзя сравнить с чем-либо по обычным правилам.
Роль <=>
: оператор сравнения с учётом NULL
Оператор <=>
, иначе известный как оператор сравнения с учётом NULL, приходит на помощь при обработке ситуаций, когда один из операндов может быть NULL. Он возвращает 1, если оба выражения равны или если оба — NULL. В противном случае — 0.
-- Применение оператора сравнения с учётом NULL
SELECT ('A' <=> 'A'), (NULL <=> NULL), ('A' <=> NULL);
-- Вернёт: 1, 1, 0
Применение функции COALESCE в контексте NULL
Функция COALESCE()
предоставляет решение для работы со значениями NULL. Она возвращает первое ненулевое значение в списке аргументов:
-- Пример применения функции COALESCE
SELECT COALESCE(NULL, NULL, 'есть', 'нет');
-- Вернёт: 'есть'
Как избежать подводных камней при работе с NULL
Взаимодействие агрегатных функций с NULL
Агрегатные функции, такие как SUM()
и AVG()
, игнорируют значения NULL, что может привести к некорректным результатам. С помощью функции COALESCE()
можно корректировать это поведение, заменяя NULL на ноль или другое подходящее значение.
-- Вычисление среднего, при этом NULL рассматривается как ноль
SELECT AVG(COALESCE(столбец, 0)) FROM таблица;
Фильтрация при наличии значений NULL
Условие WHERE столбец != 'значение'
не включает строки, где столбец равен NULL, в выборку. Чтобы включить такие строки, добавьте условие OR столбец IS NULL
:
-- Добавляем строки со значением NULL в выборку
SELECT * FROM таблица WHERE столбец != 'значение' OR столбец IS NULL;
Соединение таблиц с учетом NULL
При выполнении соединений таблиц, когда встречаются значения NULL, важно использовать оператор <=>
для корректного сопоставления значений:
-- Корректное соединение таблиц с учетом NULL
SELECT * FROM таблица1 t1
JOIN таблица2 t2 ON t1.столбец1 <=> t2.столбец2;
Визуализация
Представьте коробку 🎁. Что внутри — неясно.
Предположим, вы думаете, что там число, и спрашиваете MySQL:
MySQL отвечает: "Нет, не угадали!" (❌)
Но если вы спрашиваете, NULL ли внутри:
MySQL просто разводит руками: "Не могу знать!" (🤷♂️)
+-----------------+----------------------+
| Ваше предположение | Ответ MySQL |
+-----------------+----------------------+
| Число | Да или Нет (❌ или ✅) |
| NULL | Неизвестно (🤷♂️) |
+-----------------+----------------------+
Урок: Когда MySQL столкнется с NULL, правила меняются. Будьте внимательны и используйте IS NULL
.
Профессиональное владение NULL
Обработка NULL в условных выражениях
Для обработки NULL в сложных условиях используйте конструкции CASE
или IF
:
-- Применение CASE для обработки NULL
SELECT
CASE
WHEN столбец IS NULL THEN 'недоступно'
ELSE столбец
END
FROM таблица;
Исключение значений с учетом NULL
Для исключения определенных значений из выборки с учетом NULL используйте конструкцию NOT (столбец <=> 'значение')
:
-- Исключение значений с учетом NULL
SELECT * FROM таблица WHERE NOT (столбец <=> 'значение');
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 14.4.2 Функции и операторы сравнения — официальная документация MySQL по операциям сравнения с NULL.
- SQL – NULL значения — подробное руководство по работе с NULL.
- Различия между IS NULL и IS NOT NULL на Stack Overflow — обсуждение разницы между
IS NULL
иIS NOT NULL
на Stack Overflow. - Как обрабатывать NULL значения в SQL-запросах — руководство по обработке NULL в SQL-запросах.
- Как добавить текст в конец строк, содержащих определенный паттерн, с помощью sed или awk? – Stack Overflow — интересное обсуждение на Stack Overflow, не связанное с NULL, но стоит обратить на него внимание.