Solución - Encuentra el cliente referido
Base de datos
Estrategía: Usar <>(!=)
y IS NULL
Intuición
Algunas personas llegan a la siguiente solución en base a su intuición.
SELECT name FROM customer WHERE referee_Id <> 2;
Sin embargo, esta consulta solo regresa un resultado: Zack
aunque hay 4 clientes no referidos por Jane
(incluyéndose asi misma). Todos los clientes que no fueron referidos (aquellos con valor NULL
en la columna referee_id
) no se muestran. ¿Pero por qué sucede esto?
Algoritmo
MySQL usa lógica de tres valores — TRUE, FALSE y UNKNOWN. Cualquier cosa comparada con NULL
se evalúa al tercer valor: UNKNOWN. Ese “cualquier cosa” incluye al propio NULL. Por eso MySQL proporciona las operaciones IS NULL
y IS NOT NULL
para comprobar específicamente NULL
.
Por tanto, una condición más referee_id IS NULL
necesita ser agregada a la cláusula WHERE
como se muestra
en seguida.
Implementación
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;
Otra solución válida
SELECT name FROM customer WHERE referee_id != 2 OR referee_id IS NULL;
Consejos
La siguiente solución también es incorrecta por la misma razón mencionada antes. La clave es siempre usar los
operadores IS NULL
ó IS NOT NULL
para explícitamente verificar que el valor es o no NULL
.
SELECT name FROM customer WHERE referee_id = NULL OR referee_id <> 2;