Contenido de esta guía
Qué comprueba EXISTS
EXISTS responde a una pregunta de existencia: «¿la subconsulta devuelve alguna fila?». No importa el contenido de esa fila; basta con que exista una.
Se utiliza con frecuencia en subconsultas correlacionadas, donde la consulta interior se relaciona con la fila que la consulta exterior está evaluando.
Sintaxis básica
SELECT columnas
FROM tabla_exterior AS e
WHERE EXISTS (
SELECT 1
FROM tabla_interior AS i
WHERE i.clave = e.clave
);SELECT 1 es una convención clara: recuerda que el valor seleccionado no se utiliza. También funcionaría otra expresión, porque EXISTS solo comprueba si aparece una fila.
Ejemplo guiado
SELECT c.id, c.nombre
FROM clientes AS c
WHERE EXISTS (
SELECT 1
FROM pedidos AS p
WHERE p.cliente_id = c.id
AND p.estado = 'enviado'
)
ORDER BY c.id;| id | nombre |
|---|---|
| 1 | Ana Torres |
| 3 | Marta Ruiz |
| 5 | Sara Gómez |
| 7 | Lucía Vega |
| 9 | Noa Vidal |
| 10 | Iván Mora |
| 11 | Elena Rey |
Para cada cliente, la subconsulta busca al menos un pedido enviado con el mismo cliente_id. Un cliente aparece una sola vez aunque tenga varios pedidos que cumplan la condición.
NOT EXISTS expresa ausencia. Cambiar a WHERE NOT EXISTS (...) devuelve los clientes para los que la subconsulta no encuentra ninguna fila.
Error frecuente
Olvidar la relación con la consulta exterior
Si eliminas p.cliente_id = c.id, la subconsulta deja de preguntar por cada cliente. Si existe un solo pedido enviado en toda la tabla, la condición será verdadera para todos los clientes.
Localiza siempre la columna que conecta la consulta interior con la fila exterior.
Comprueba lo aprendido
Encuentra quién supervisa a otra persona
Devuelve id y nombre de los empleados para los que exista al menos otra fila de empleados cuyo responsable_id coincida con su identificador.
empleados con otro alias.equipo.responsable_id con responsable.id.Solución razonada
SELECT responsable.id, responsable.nombre
FROM empleados AS responsable
WHERE EXISTS (
SELECT 1
FROM empleados AS equipo
WHERE equipo.responsable_id = responsable.id
)
ORDER BY responsable.id;| id | nombre |
|---|---|
| 1 | Carmen Soler |
| 2 | Alex Ramos |
| 4 | Carlos Peña |
| 8 | Gonzalo Nieto |
Cada responsable aparece una sola vez aunque supervise a varias personas, porque EXISTS solo necesita confirmar la primera coincidencia lógica.
Compatibilidad entre motores
EXISTS y NOT EXISTS están disponibles en los principales motores. El optimizador puede transformar la consulta internamente, por lo que no debes asumir que la subconsulta se ejecuta de forma literal para cada fila. Escribe la condición de forma correcta y utiliza EXPLAIN cuando necesites estudiar el plan.
Qué debes recordar
EXISTScomprueba filas, no valores concretos.- Una subconsulta correlacionada debe enlazarse con la consulta exterior.
NOT EXISTSes útil para encontrar ausencias.- El contenido de la lista
SELECTinterior no afecta al resultado de existencia.