Usar IN y evitar trampas con NOT IN
Objetivos
Al terminar podrás usar una lista calculada por una subconsulta y revisar sus nulos antes de negar la comparación.
Concepto
IN (subconsulta) comprueba si un valor coincide con algún valor de la lista interior. La subconsulta debe devolver una columna compatible con la columna exterior.
NOT IN tiene una precaución: si la lista contiene NULL, una comparación que no coincide puede evaluarse como desconocida, no como verdadera. Para una exclusión, filtra explícitamente los nulos o considera NOT EXISTS con una relación correlacionada.
Ejemplo
Primero encuentra clientes con al menos un pago de cinco o más:
SELECT customer_id
FROM customer
WHERE customer_id IN (
SELECT customer_id
FROM payment
WHERE amount >= 5.00
)
ORDER BY customer_id
LIMIT 10;Para excluir alquileres que ya aparecen en pagos, la consulta elimina NULL de la lista antes de usar NOT IN:
SELECT r.rental_id, r.inventory_id
FROM rental AS r
WHERE r.rental_id NOT IN (
SELECT p.rental_id
FROM payment AS p
WHERE p.rental_id IS NOT NULL
)
ORDER BY r.rental_id
LIMIT 10;El filtro interior es parte de la lógica, no una limpieza opcional. Revisa la nulabilidad de la columna usada por la subconsulta.
Práctica guiada
- Quita el filtro
IS NOT NULLy explica qué puede pasar si la subconsulta devuelve un nulo. - Sustituye la lista por otra columna y comprueba que los tipos comparados sean compatibles.
- Reescribe la exclusión con
NOT EXISTSy compara el resultado.
Reto
Usa IN para encontrar películas que tengan al menos una copia en inventory. Luego escribe una consulta equivalente con EXISTS y compara las claves devueltas.
Ver respuesta al reto
SELECT f.film_id
FROM sakila.film AS f
WHERE f.film_id IN (SELECT i.film_id FROM sakila.inventory AS i)
ORDER BY f.film_id;
SELECT f.film_id
FROM sakila.film AS f
WHERE EXISTS (
SELECT 1 FROM sakila.inventory AS i WHERE i.film_id = f.film_id
)
ORDER BY f.film_id;Ambas consultas buscan películas con al menos una copia. Compara sus film_id para comprobar que devuelven el mismo conjunto.
Quiz
Comprobación
Ya inspeccionas la lista antes de excluirla. La próxima lección usa EXISTS y NOT EXISTS para expresar relaciones.