Comprobar relaciones con EXISTS
Objetivos
Al terminar podrás preguntar si existe una fila relacionada sin incorporar sus columnas al resultado.
Concepto
EXISTS es verdadero cuando la subconsulta devuelve al menos una fila. NOT EXISTS es verdadero cuando no encuentra ninguna. La consulta interior suele usar una condición correlacionada que se refiere a la fila exterior.
El SELECT 1 interior solo expresa que importa la existencia; su valor no aparece en la salida. Esta forma evita multiplicar la fila exterior cuando hay varias coincidencias.
Ejemplo
Películas que tienen al menos una copia:
SELECT f.film_id, f.title
FROM film AS f
WHERE EXISTS (
SELECT 1
FROM inventory AS i
WHERE i.film_id = f.film_id
)
ORDER BY f.film_id
LIMIT 10;Películas para las que no existe una copia registrada:
SELECT f.film_id, f.title
FROM film AS f
WHERE NOT EXISTS (
SELECT 1
FROM inventory AS i
WHERE i.film_id = f.film_id
)
ORDER BY f.film_id
LIMIT 10;Ambas consultas conservan una fila por película; un JOIN directo podría producir varias filas para un título con varias copias.
Práctica guiada
- Cambia
EXISTSporNOT EXISTSy predice qué conjunto devuelve. - Quita
i.film_id = f.film_idy explica por qué la subconsulta deja de depender de cada película. - Reescribe una de las consultas con
LEFT JOINeIS NULL.
Reto
Lista clientes que no tienen pagos usando NOT EXISTS. Devuelve solo customer_id, ordena por identificador y limita la salida. No agregues una unión que multiplique clientes.
Ver respuesta al reto
SELECT c.customer_id
FROM sakila.customer AS c
WHERE NOT EXISTS (
SELECT 1 FROM sakila.payment AS p
WHERE p.customer_id = c.customer_id
)
ORDER BY c.customer_id
LIMIT 20;La consulta devuelve una fila por cliente que no tiene pagos; no une las filas de pagos.
Quiz
Comprobación
Ya compruebas relaciones sin ampliar el grano. La próxima lección usa una subconsulta correlacionada para calcular un resumen por cada cliente.