> lección 17/18 · 14 min

EXISTS y NOT EXISTS

Concepto

Algunas preguntas son de sí o no: "¿este estudiante tiene alguna inscripción en observación?", "¿este curso tiene inscritos?". EXISTS responde eso para cada fila: es verdadero si la subconsulta devuelve al menos una fila.

Sintaxis
SELECT columnas
FROM tabla_a AS a
WHERE EXISTS (
  SELECT 1 FROM tabla_b AS b WHERE b.a_id = a.id
);

Una subconsulta que mira la fila de afuera. Dentro del EXISTS, la condición i.estudiante_id = e.id usa la fila de estudiantes que se está revisando. Por eso la subconsulta se evalúa una vez por cada estudiante. A esto se le llama subconsulta correlacionada.

SELECT e.nombre
FROM estudiantes AS e
WHERE EXISTS (
  SELECT 1 FROM inscripciones AS i
  WHERE i.estudiante_id = e.id AND i.estado = 'observacion'
);

No importa qué devuelve. EXISTS solo pregunta si hay alguna fila. Por eso se escribe SELECT 1: el valor da igual.

NOT EXISTS: los que no tienen. Es la forma más clara de encontrar lo que falta: estudiantes sin inscripciones, cursos sin inscritos, clientes sin compras.

SELECT e.nombre
FROM estudiantes AS e
WHERE NOT EXISTS (
  SELECT 1 FROM inscripciones AS i WHERE i.estudiante_id = e.id
);

Frente a un JOIN. Un JOIN repite al estudiante una vez por cada inscripción que cumple; EXISTS lo muestra una sola vez, porque solo pregunta si existe.

> tarea SQL

Para destacar los cursos sin alertas, lista los cursos que no tienen ninguna inscripción en estado 'riesgo'. Devuelve una sola columna: titulo.

Tablas disponibles
  • cursos: id, titulo, nivel, horas
  • estudiantes: id, nombre, correo, edad, ciudad
  • inscripciones: id, estudiante_id, curso_id, nota, estado

Primero intenta: las pistas aparecen después de 2 intentos con un resultado incorrecto (los errores de código no cuentan). Llevas 0.

Aprueba las tareas de esta lección para ver el cierre.