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.
Quiz
¿Por qué NOT IN puede excluir todas las filas si la lista contiene un NULL?
- A. Porque la comparación puede quedar desconocida para cada candidato.
- B. Porque
NULLse convierte automáticamente en cero. - C. Porque
NOT INborra la tabla interior.
Respuesta: A. La lógica ternaria de SQL impide tratar NULL como una igualdad o desigualdad ordinaria.
Comprobación
Ya inspeccionas la lista antes de excluirla. La próxima lección usa EXISTS y NOT EXISTS para expresar relaciones.