DÍA 26Subconsultas y CTE · SQL para Análisis de Datos

Filtra con listas internas y controla los nulos antes de una exclusión.

Día 26 20 minIntermedio

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

  1. Quita el filtro IS NOT NULL y explica qué puede pasar si la subconsulta devuelve un nulo.
  2. Sustituye la lista por otra columna y comprueba que los tipos comparados sean compatibles.
  3. Reescribe la exclusión con NOT EXISTS y 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

1. ¿Por qué NOT IN puede excluir todas las filas si la lista contiene un NULL?
2. ¿Cuándo una subconsulta es correlacionada?
3. ¿Cuánto dura un CTE declarado con WITH?

Comprobación

Ya inspeccionas la lista antes de excluirla. La próxima lección usa EXISTS y NOT EXISTS para expresar relaciones.

TU PROGRESO

Cargando estado…