TL; DR
Это NULLбезопасный оператор равных .
Как и обычный =оператор, сравниваются два значения, и результат либо 0(не равен), либо 1(равен); другими словами: 'a' <=> 'b'урожайность 0и 'a' <=> 'a'урожайность 1.
В отличие от обычного =оператора, значения NULLне имеют особого значения и поэтому никогда не приводят NULLк возможному результату; итак: 'a' <=> NULLурожайность 0и NULL <=> NULLурожайность 1.
Полезность
Это может пригодиться, когда оба операнда могут содержать NULLи вам нужен согласованный результат сравнения между двумя столбцами.
Другой вариант использования с подготовленными утверждениями, например:
... WHERE col_a <=> ? ...
Здесь заполнитель может быть скалярным значением или NULLбез необходимости что-либо менять в запросе.
Связанные операторы
Кроме того, <=>есть также два других оператора, которые можно использовать для сравнения NULL, а именно IS NULLи IS NOT NULL; они являются частью стандарта ANSI и поэтому поддерживаются в других базах данных, в отличие от <=>MySQL.
Вы можете думать о них как о специализациях MySQL <=>:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Исходя из этого, ваш конкретный запрос (фрагмент) может быть преобразован в более переносимый:
WHERE p.name IS NULL
Служба поддержки
Стандарт SQL: 2003 ввел предикат для этого, который работает точно так же, как <=>оператор MySQL , в следующей форме:
IS [NOT] DISTINCT FROM
Следующее поддерживается повсеместно, но является относительно сложным:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
spaceshipоператор