Al terminar, podrás
- Distinguir una subconsulta escalar de una subconsulta que devuelve varias filas.
- Probar la consulta interior antes de incorporarla a la exterior.
- Usar
EXISTScuando solo importa saber si existe una coincidencia.
Recupera lo aprendido: ¿AVG(precio) sin GROUP BY devuelve un valor por producto o un único promedio?
La idea clave
Una subconsulta es un SELECT dentro de otra sentencia. El contexto exterior determina qué forma necesita: un único valor para una comparación escalar, una columna para IN o una mera comprobación de existencia para EXISTS.
Método seguro: si la subconsulta es independiente, ejecútala primero y observa cuántas filas y columnas devuelve. Si usa una columna exterior, prueba la relación con un identificador concreto: esa subconsulta depende de la fila exterior y no puede ejecutarse aislada sin adaptar la referencia.
La sintaxis básica
-- Un valor
WHERE precio > (SELECT AVG(precio) FROM productos)
-- Una lista
WHERE cliente_id IN (SELECT id FROM clientes WHERE activo = 1)
-- Existencia
WHERE EXISTS (SELECT 1 FROM pedidos WHERE ...);| La consulta exterior necesita… | Forma útil | Pregunta de control |
|---|---|---|
| un valor | subconsulta escalar | ¿devuelve una columna y como máximo una fila? |
| una lista de valores | IN | ¿devuelve una sola columna? |
| saber si existe alguna fila | EXISTS | ¿basta con encontrar una coincidencia? |
Ejemplo paso a paso
| nombre | precio |
|---|---|
| Monitor 24 | 179,00 |
| Monitor 27 | 249,00 |
| Portátil Pro | 999,00 |
El precio medio de los nueve productos es aproximadamente 191,81. La consulta exterior conservará únicamente los precios superiores a ese valor.
SELECT nombre, precio
FROM productos
WHERE precio > (SELECT AVG(precio) FROM productos)
ORDER BY precio;| nombre | precio |
|---|---|
| Monitor 27 | 249,00 |
| Portátil Pro | 999,00 |
Cómo funciona
- La consulta interior devuelve una fila y una columna: el promedio.
- Ese valor se compara con el precio de cada producto.
- El
ORDER BYpertenece a la consulta exterior y ordena las filas finales.
Un error habitual
Usar una subconsulta no escalar como si fuera un valor
WHERE precio > (SELECT precio FROM productos);La consulta interior puede devolver muchas filas. PostgreSQL y otros motores producen un error en un contexto escalar. SQLite toma la primera fila, un comportamiento específico que no conviene usar como SQL portable. Agrega, filtra o utiliza IN/EXISTS según la intención.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Escribe una consulta que devuelva id y total de pedidos cuyo total sea superior a la media de todos los pedidos.
Resultado esperado: 4 filas con id, total. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Escribe primero SELECT AVG(total) FROM pedidos.
Colócala entre paréntesis.
La consulta exterior selecciona id y total.
Solución
SELECT id, total FROM pedidos WHERE total > (SELECT AVG(total) FROM pedidos);La subconsulta devuelve un único valor, adecuado para compararlo con cada pedido.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Puente hacia EXISTS: una subconsulta puede usar un valor de la fila exterior. En ese caso se evalúa la pregunta “¿existe al menos una fila relacionada con este producto/cliente?”. Esa relación entre la consulta interior y la fila exterior se llama correlación. En el ejemplo con EXISTS, d.producto_id = pr.id es precisamente ese enlace.
Fuentes técnicas consultadas
Las fuentes distinguen subconsultas escalares, expresiones de existencia y subconsultas correlacionadas.
- PostgreSQL: subconsultas escalares
- PostgreSQL: EXISTS, IN y otras expresiones con subconsultas
- SQLite: subconsultas escalares y correlacionadas
Comprueba si puedes explicarlo
¿Qué ocurre si una subconsulta escalar no devuelve ninguna fila?
Ver respuesta razonada
Su valor es NULL. Una comparación como precio > (subconsulta vacía) no resulta verdadera. Si la pregunta solo es si hay coincidencias, utiliza EXISTS o NOT EXISTS.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- Comprueba siempre la forma del resultado interior.
- Elige IN para comparar con una lista y EXISTS para comprobar presencia.
- No dependas del tratamiento particular de SQLite cuando una subconsulta escalar devuelve varias filas.
A continuación: Continúa con Organiza consultas por etapas con CTE.