Filtros · subconsultas

EXISTS

Devuelve verdadero cuando una subconsulta encuentra al menos una fila y falso cuando no encuentra ninguna.

Lectura: 5–7 minEjemplo comprobadoPráctica con pistas
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

Forma general
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

Clientes con pedidos enviados
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;
Resultado completo comprobado en SQLite
idnombre
1Ana Torres
3Marta Ruiz
5Sara Gómez
7Lucía Vega
9Noa Vidal
10Iván Mora
11Elena 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

Intermedia · subconsulta correlacionada

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.

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

  • EXISTS comprueba filas, no valores concretos.
  • Una subconsulta correlacionada debe enlazarse con la consulta exterior.
  • NOT EXISTS es útil para encontrar ausencias.
  • El contenido de la lista SELECT interior no afecta al resultado de existencia.

Conceptos relacionados

Fuentes técnicas consultadas