Оператор <=> в MySQL: сравнение с NULL и другими значениями
Быстрый ответ
Оператор <=>, применяемый в MySQL, служит для сравнения значений, в том числе NULL. Он отличается от обычного оператора =, поскольку считает NULL равным NULL (выражение NULL <=> NULL возвращает 1). Это помогает избежать ситуаций, когда сравнение с NULL приводит к неопределенности. Пример запроса:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
вернёт 1, 1 и 0 соответственно, показывая, что оператор <=> обрабатывает NULL как полноценное значение, что не свойственно оператору =.

Глубже в теме
Оператор <=> становится незаменимым при работе с трёхзначной логикой в SQL: истина, ложь и неопределенность. Если стандартное сравнение через = с NULL возвращает UNKNOWN, то <=> всегда подаёт конкретный ответ: либо 1 (истина), либо 0 (ложь).
Использование сравнений, учитывающих NULL
Данный оператор идеально подходит для условных запросов, например, в разделах join или where, особенно если в столбцах могут встретиться NULL. Это помогает избежать ненужного исключения строк с значением NULL.
SELECT *
FROM table1 T1
JOIN table2 T2 ON T1.nullable_column <=> T2.nullable_column; -- Дружба с NULL-значениями приветствуется 🥳
Инверсия сравнений, учитывающих NULL
Для инвертирования результата сравнения с NULL можно использовать NOT в сочетании с <=>:
SELECT *
FROM your_table
WHERE NOT (your_column <=> NULL); -- Мастерское обход знаний о NULL 🏆
Тогда в результатах будут только те строки, в которых your_column не является NULL.
Подводные камни
Остерегайтесь думать, что <=> ведет себя точно так же, как =, в случаях когда NULL отсутствует в сравнении. Чаще всего, это так, но важно помнить, что <=> разрабатывался для работы с NULL, и его использование вместо = может привести к непредсказуемым результатам.
Контекст различных SQL-диалектов
Оператор <=> в MySQL аналогичен выражению IS NOT DISTINCT FROM из стандарта SQL:2003 благодаря их подобной функциональности. При разработке кода, мигрирующего между платформами, важно оценивать альтернативы для СУБД, которые не поддерживают <=>.
Визуализация
Можно представить сравнение как взвешивание на чашах весов:
| Значение (A) | Оператор <=> | Значение (B) | Результат сравнения |
| -------------| :----------: | ------------ | ------------------- |
| 5 | <=> | 5 | ИСТИНА (1) | # Они полностью совпадают, отлично! 🙌
| 7 | <=> | 3 | ЛОЖЬ (0) | # Не получилось, они не равны. 👎
| NULL | <=> | NULL | ИСТИНА (1) | # Объединение двух пустот тоже имеет значение! 🎭
Оператор <=> действует как объективный арбитр, признающий NULL-значения эквивалентными и поддерживающий равновесие даже там, где присутствует "пустота".
Ввёдение <=> в ваш SQL-арсенал
<=> незаменим при синхронизации данных и сложных запросах, где могут встречаться подзапросы с NULL значениями. Его однозначность помогает обеспечивать целостность данных.
Интеграция с scripting языками
При работе с MySQL на языках типа PHP или Python, <=> упрощает обработку NULL в подготовленных выражениях, минимизируя сложную логику в условиях проверки на NULL.
Подсказка для оптимизатора
Применение <=> способствует оптимизации запросов в MySQL за счёт упрощения трёхзначной логики, которая может усложнять работу оптимизаторов. Это гарантирует лучший результат при работе с NULL.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 12.4.2 Функции и операторы сравнения — подробное описание оператора сравнения с учётом NULL
<=>в MySQL. - php – Laravel 5.1 Неизвестный тип базы данных enum запрошен – Stack Overflow — обсуждение на StackOverflow, где упоминается оператор MySQL
<=>, вопреки различающемуся заголовку вопроса. - MySQL оператор равенства – w3resource — Примеры и пояснения, акцентирующие внимание на использовании оператора
<=>в MySQL. - Разгадывание загадки SQL-операторов – В том числе
<=>– Medium — обзор операторов, включая и оператор<=>MySQL.