Работа с NULL-значениями в выборках MySQL: случай '!='C'

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для проверки значения на равенство NULL используйте конструкции IS NULL или IS NOT NULL. Если вам нужно считать NULL равным самому себе при сравнении, применяйте оператор <=>. Чтобы заменить NULL на значение по умолчанию, воспользуйтесь функцией COALESCE().

Пример:

SQL
Скопировать код
-- Обнаружение значений столбца, равных NULL
SELECT * FROM таблица WHERE столбец IS NULL;

-- Сравнение столбца с NULL с учётом NULL-значений
SELECT * FROM таблица WHERE столбец <=> NULL;

-- Замена значений столбца NULL на альтернативное значение
SELECT * FROM таблица WHERE COALESCE(столбец, 'значение_по_умолчанию') = 'ожидаемое_значение';
Кинга Идем в IT: пошаговый план для смены профессии

Нюансы работы с NULL

Особенности поведения NULL

В MySQL NULL обозначает отсутствие конкретного значения, это делает стандартное сравнение с помощью = или != неприменимым, так как NULL нельзя сравнить с чем-либо по обычным правилам.

Роль <=>: оператор сравнения с учётом NULL

Оператор <=>, иначе известный как оператор сравнения с учётом NULL, приходит на помощь при обработке ситуаций, когда один из операндов может быть NULL. Он возвращает 1, если оба выражения равны или если оба — NULL. В противном случае — 0.

SQL
Скопировать код
-- Применение оператора сравнения с учётом NULL
SELECT ('A' <=> 'A'), (NULL <=> NULL), ('A' <=> NULL);
-- Вернёт: 1, 1, 0

Применение функции COALESCE в контексте NULL

Функция COALESCE() предоставляет решение для работы со значениями NULL. Она возвращает первое ненулевое значение в списке аргументов:

SQL
Скопировать код
-- Пример применения функции COALESCE
SELECT COALESCE(NULL, NULL, 'есть', 'нет');
-- Вернёт: 'есть'

Как избежать подводных камней при работе с NULL

Взаимодействие агрегатных функций с NULL

Агрегатные функции, такие как SUM() и AVG(), игнорируют значения NULL, что может привести к некорректным результатам. С помощью функции COALESCE() можно корректировать это поведение, заменяя NULL на ноль или другое подходящее значение.

SQL
Скопировать код
-- Вычисление среднего, при этом NULL рассматривается как ноль
SELECT AVG(COALESCE(столбец, 0)) FROM таблица;

Фильтрация при наличии значений NULL

Условие WHERE столбец != 'значение' не включает строки, где столбец равен NULL, в выборку. Чтобы включить такие строки, добавьте условие OR столбец IS NULL:

SQL
Скопировать код
-- Добавляем строки со значением NULL в выборку
SELECT * FROM таблица WHERE столбец != 'значение' OR столбец IS NULL;

Соединение таблиц с учетом NULL

При выполнении соединений таблиц, когда встречаются значения NULL, важно использовать оператор <=> для корректного сопоставления значений:

SQL
Скопировать код
-- Корректное соединение таблиц с учетом NULL
SELECT * FROM таблица1 t1
JOIN таблица2 t2 ON t1.столбец1 <=> t2.столбец2;

Визуализация

Markdown
Скопировать код
Представьте коробку 🎁. Что внутри — неясно.

Предположим, вы думаете, что там число, и спрашиваете MySQL:
MySQL отвечает: "Нет, не угадали!" (❌)

Но если вы спрашиваете, NULL ли внутри:
MySQL просто разводит руками: "Не могу знать!" (🤷‍♂️)

+-----------------+----------------------+
| Ваше предположение | Ответ MySQL         |
+-----------------+----------------------+
| Число           | Да или Нет (❌ или ✅) |
| NULL            | Неизвестно (🤷‍♂️)       |
+-----------------+----------------------+

Урок: Когда MySQL столкнется с NULL, правила меняются. Будьте внимательны и используйте IS NULL.

Профессиональное владение NULL

Обработка NULL в условных выражениях

Для обработки NULL в сложных условиях используйте конструкции CASE или IF:

SQL
Скопировать код
-- Применение CASE для обработки NULL
SELECT 
  CASE 
    WHEN столбец IS NULL THEN 'недоступно'
    ELSE столбец
  END 
FROM таблица;

Исключение значений с учетом NULL

Для исключения определенных значений из выборки с учетом NULL используйте конструкцию NOT (столбец <=> 'значение'):

SQL
Скопировать код
-- Исключение значений с учетом NULL
SELECT * FROM таблица WHERE NOT (столбец <=> 'значение');

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 14.4.2 Функции и операторы сравнения — официальная документация MySQL по операциям сравнения с NULL.
  2. SQL – NULL значения — подробное руководство по работе с NULL.
  3. Различия между IS NULL и IS NOT NULL на Stack Overflow — обсуждение разницы между IS NULL и IS NOT NULL на Stack Overflow.
  4. Как обрабатывать NULL значения в SQL-запросах — руководство по обработке NULL в SQL-запросах.
  5. Как добавить текст в конец строк, содержащих определенный паттерн, с помощью sed или awk? – Stack Overflow — интересное обсуждение на Stack Overflow, не связанное с NULL, но стоит обратить на него внимание.