queryLab · software_de_entrenamiento en espera
Nivel 2 · Intermedio · SQL · DQL

[SQL 08] Subconsultas

Escalares, IN, EXISTS, correlacionadas y tablas derivadas.
0 / 7 retos resueltos 📘 SQL COMANDOS · subquery en SELECT, FROM y WHERE
Al terminar esta práctica podrás…
  • Usar una subconsulta que devuelve un valor (escalar) para comparar.
  • Filtrar con IN / NOT IN y EXISTS / NOT EXISTS, y conocer la trampa de NOT IN con NULL.
  • Escribir subconsultas correlacionadas (dependen de la fila externa).
  • Usar subconsultas en el SELECT y en el FROM (tablas derivadas).

Una subconsulta es un SELECT dentro de otra sentencia, entre paréntesis. Sirve para responder preguntas en dos pasos: «¿quién gana más que el promedio?» → primero calcula el promedio y luego compara.

  • Escalar: devuelve un único valor; se compara con =, >, <…
  • De lista: devuelve una columna; se usa con IN / NOT IN.
  • EXISTS: pregunta si la subconsulta devuelve al menos una fila.
  • Correlacionada: usa columnas de la consulta externa y se evalúa por cada fila.
  • Tabla derivada: una subconsulta en el FROM, con alias, que se consulta como una tabla.

Nota de motor: Oracle, MySQL y PostgreSQL aceptan > ANY (…) y > ALL (…); SQLite no. Su equivalente universal es comparar con MIN o MAX: > ALL (…) ≡ > (SELECT MAX(…)).

Sintaxis
SELECT …
FROM t
WHERE col > (SELECT AVG(col) FROM t)
  AND col2 IN (SELECT … FROM t2 WHERE …)
  AND EXISTS (SELECT 1 FROM t3 WHERE t3.fk = t.pk);
Escalar
WHERE salary > (SELECT AVG(salary) FROM employees)
IN
Pertenece a la lista que devuelve la subconsulta.
NOT IN + NULL
Si la lista contiene un NULL, NOT IN no devuelve nada.
EXISTS
Verdadero si la subconsulta devuelve alguna fila. Seguro frente a NULL.
Correlacionada
La interna usa la fila externa: WHERE e2.department_id = e.department_id.
Derivada (FROM)
FROM (SELECT …) AS t: un resultado intermedio con nombre.
Oracle / MySQL / PostgreSQL
salary > ALL (SELECT salary FROM … )
Equivalente universal
salary > (SELECT MAX(salary) FROM … )

1 · Ejemplos guiados · ejecuta y modifica cada bloque

01Subconsulta escalar
Quién gana más que el promedio de la empresa.
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
02IN con una lista calculada
Empleados que trabajan en departamentos ubicados en Estados Unidos.
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
03La trampa de NOT IN con NULL
¿Quiénes no son jefes de nadie? La primera consulta devuelve 0 filas porque la lista de manager_id contiene un NULL (el presidente). La segunda filtra el NULL y funciona.
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
04EXISTS / NOT EXISTS
Empleados que tuvieron un cargo anterior (aparecen en job_history).
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
05Subconsulta correlacionada
Quién gana más que el promedio de su propio departamento: la interna se recalcula por cada fila externa.
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
06Subconsulta en el SELECT
Cada fila muestra su salario junto al promedio general y la diferencia con él.
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.
07Tabla derivada en el FROM
Un resumen por departamento se consulta como si fuera una tabla (necesita alias).
sql-subconsultas.sql
Presiona «ejecutar» para ver el resultado.

⚠ Errores frecuentes

  • Usar = con una subconsulta que devuelve varias filas. Si puede devolver más de una, usa IN.
  • NOT IN con una subconsulta que puede devolver NULL: no devuelve nada. Usa NOT EXISTS o filtra IS NOT NULL.
  • Olvidar el alias de una tabla derivada (FROM (SELECT …) AS t): varios motores lo exigen.
  • Usar ANY / ALL en SQLite: no existen; reemplázalos por MIN/MAX.

2 · Retos con corrección automática

Escribe tu solución y pulsa comprobar (Ctrl + Enter). Tu consulta y la solución se ejecutan en bases limpias y se comparan los resultados: no importan los nombres de las columnas, sí los datos (y el orden, cuando el reto lo pide). Si te atascas, usa la pista o mira el resultado esperado.

3 · Preguntas tipo solemne

1. ¿Qué pasa con WHERE id NOT IN (SELECT jefe_id FROM t) si algún jefe_id es NULL?
2. En SQLite no existe salary > ALL (SELECT salary FROM … ). ¿Cuál es su equivalente?
3. ¿Qué caracteriza a una subconsulta correlacionada?