Tema SQL
EXISTS (subconsulta)
Predicado que es verdadero si la subconsulta devuelve al menos una fila; falso si el conjunto interno está vacío. No inspecciona valores devueltos, solo existencia.
Descripción
EXISTS suele escribirse como EXISTS (SELECT 1 FROM … WHERE correlación). El motor puede optimizarlo como semi-join: se corta en la primera coincidencia. NOT EXISTS expresa ausencia de filas relacionadas y es un patrón habitual para reglas de integridad en consultas (clientes sin pedidos). La correlación enlaza columnas externas con internas; sin correlación, EXISTS es constante para toda la consulta exterior. Prefiere EXISTS frente a IN con subconsultas grandes cuando la semántica es de existencia, no de lista materializada.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SELECT columnas
FROM tabla t
WHERE [ NOT ] EXISTS (
SELECT 1 FROM otra o WHERE o.ref = t.id
);
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- EXISTS
- La subconsulta puede devolver cualquier columnas; lo habitual es SELECT 1 o SELECT NULL por convención.
- Correlación
- Referencias a t.* en la subconsulta hacen que se evalúe en el contexto de cada fila exterior; el optimizador puede reescribirlo como join o anti-join.
Ejemplos
Ejemplo 1
SELECT c.nombre
FROM clientes c
WHERE EXISTS (
SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
);
Ejemplo 2
SELECT 1
WHERE EXISTS (SELECT 1 FROM pedidos LIMIT 1);
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.