not ejemplo sql mysql

ejemplo - where not in mysql



MySQL SELECT x FROM WHERE NOT IN(SELECT x FROM b)-Resultado inesperado (4)

Espero que el resultado de la tercera consulta a continuación contenga id = 732. No lo hace ¿Porqué es eso?

mysql> SELECT id FROM match ORDER BY id DESC LIMIT 5 ; +------------+ | id | +------------+ | 732 | | 730 | | 655 | | 458 | | 456 | +------------+ 5 rows in set (0.00 sec) mysql> SELECT id FROM email ORDER BY id DESC LIMIT 5 ; +------------+ | id | +------------+ | 731 | | 727 | | 725 | | 724 | | 723 | +------------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email ) ; Empty set (0.00 sec)

Hay tres entradas NULL en la tabla email.id, y no hay entradas NULL en match.id.

La tabla completa / consultas se pueden ver en


... o si realmente quieres usar NOT IN puedes usar

SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email WHERE id IS NOT NULL)


Aquí hay algunos SQL que realmente tienen sentido:

SELECT m.id FROM match m LEFT JOIN email e ON e.id = m.id WHERE e.id IS NULL

Simple siempre es mejor.


Estoy un poco fuera de contacto con los detalles de cómo MySQL trata con los nulos, pero aquí hay dos cosas para probar:

SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email WHERE id IS NOT NULL) ; SELECT m.* FROM match m LEFT OUTER JOIN email e ON m.id = e.id AND e.id IS NOT NULL WHERE e.id IS NULL

La segunda consulta parece contraria a la intuición, pero cumple la condición de unión y luego la condición where. Este es el caso donde las uniones y donde las cláusulas no son equivalentes.


De la documentation :

Para cumplir con el estándar SQL , IN devuelve NULL no solo si la expresión del lado izquierdo es NULL , sino también si no se encuentra una coincidencia en la lista y una de las expresiones en la lista es NULL .

Este es exactamente tu caso.

Tanto IN como NOT IN devuelven NULL que no es una condición aceptable para la cláusula WHERE .

Reescriba su consulta de la siguiente manera:

SELECT * FROM match m WHERE NOT EXISTS ( SELECT 1 FROM email e WHERE e.id = m.id )