TL;DR
Es el NULL seguro igual
operador.
Como el = regular operador, se comparan dos valores y el resultado es 0 (distinto) o 1 (igual); en otras palabras:'a' <=> 'b' produce 0 y 'a' <=> 'a' produce 1 .
A diferencia del = regular operador, valores de NULL no tiene un significado especial, por lo que nunca produce NULL como un posible resultado; entonces:'a' <=> NULL produce 0 y NULL <=> NULL produce 1 .
Utilidad
Esto puede resultar útil cuando ambos operandos pueden contener NULL y necesita un resultado de comparación consistente entre dos columnas.
Otro caso de uso es con declaraciones preparadas, por ejemplo:
... WHERE col_a <=> ? ...
Aquí, el marcador de posición puede ser un valor escalar o NULL sin tener que cambiar nada sobre la consulta.
Operadores relacionados
Además de <=> también hay otros dos operadores que se pueden usar para comparar con NULL , a saber, IS NULL y IS NOT NULL; son parte del estándar ANSI y, por lo tanto, son compatibles con otras bases de datos, a diferencia de <=> , que es específico de MySQL.
Puede pensar en ellos como especializaciones de <=> de MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
En base a esto, su consulta particular (fragmento) se puede convertir a la más portátil:
WHERE p.name IS NULL
Soporte
El estándar SQL:2003 introdujo un predicado para esto, que funciona exactamente como <=> de MySQL operador, de la siguiente forma:
IS [NOT] DISTINCT FROM
Lo siguiente es compatible universalmente, pero es relativamente complejo:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1