Una subconsulta es una consulta anidada dentro de otra consulta principal. Se utiliza para obtener un resultado intermedio que luego se usa en la consulta principal.
Las subconsultas pueden aparecer en:
✅ La cláusula SELECT
(para obtener valores calculados)
✅ La cláusula FROM
(como una tabla derivada)
✅ La cláusula WHERE
(para filtrar datos)
✅ La cláusula HAVING
(para filtrar agregaciones)
📌 Reglas de las subconsultas:
()
.IN
, EXISTS
, etc.).WHERE
(Filtrar con un valor calculado)Supongamos que tenemos una tabla ventas
:
id | cliente | total_venta |
---|---|---|
1 | Juan | 200 |
2 | María | 450 |
3 | Pedro | 300 |
4 | Ana | 600 |
Si queremos ver las ventas mayores al promedio, podemos usar una subconsulta en WHERE
:
SELECT *
FROM ventas
WHERE total_venta > (SELECT AVG(total_venta) FROM ventas);
📌 Explicación:
(SELECT AVG(total_venta) FROM ventas)
calcula el promedio de ventas.SELECT
(Valor calculado por fila)Queremos mostrar cada venta junto con el promedio de todas las ventas:
SELECT id, cliente, total_venta,
(SELECT AVG(total_venta) FROM ventas) AS promedio_ventas
FROM ventas;
Salida:
id | cliente | total_venta | promedio_ventas |
---|---|---|---|
1 | Juan | 200 | 387.5 |
2 | María | 450 | 387.5 |
3 | Pedro | 300 | 387.5 |
4 | Ana | 600 | 387.5 |
📌 Explicación:
FROM
(Tabla derivada)Supongamos que queremos calcular el total de ventas por cliente, pero solo mostrar clientes con ventas mayores a 300.
SELECT cliente, total
FROM (SELECT cliente, SUM(total_venta) AS total
FROM ventas
GROUP BY cliente) AS ventas_agrupadas
WHERE total > 300;
📌 Explicación:
ventas_agrupadas
) calcula la suma de ventas por cliente.EXISTS
(Verificar existencia)Si tenemos una tabla de clientes:
id_cliente | nombre |
---|---|
1 | Juan |
2 | María |
3 | Pedro |
4 | Ana |
Y una tabla de pedidos:
id_pedido | id_cliente | total |
---|---|---|
101 | 1 | 200 |
102 | 2 | 450 |
Queremos listar solo los clientes que han hecho pedidos:
SELECT nombre
FROM clientes c
WHERE EXISTS (SELECT 1 FROM pedidos p WHERE p.id_cliente = c.id_cliente);
📌 Explicación:
EXISTS
devuelve TRUE
si la subconsulta encuentra alguna coincidencia.pedidos
.IN
(Filtrar por una lista de valores)Queremos ver las ventas solo de los clientes que han hecho pedidos:
SELECT * FROM ventas
WHERE cliente IN (SELECT nombre FROM clientes
WHERE id_cliente IN (SELECT id_cliente FROM pedidos));
📌 Explicación:
id_cliente
que han hecho pedidos.ventas
solo de esos clientes.✔ Cuando una consulta depende del resultado de otra.
✔ Para evitar múltiples JOINs
en algunas situaciones.
✔ Para mejorar la legibilidad del código en ciertas consultas complejas.
📌 Alternativa: En algunos casos, un JOIN
puede ser más eficiente que una subconsulta.
✅ Subconsultas permiten usar el resultado de una consulta dentro de otra.
✅ Se pueden usar en SELECT
, FROM
, WHERE
, HAVING
, y EXISTS
.
✅ Son útiles para cálculos intermedios y filtros avanzados.
✅ En algunos casos, un JOIN
puede ser más rápido que una subconsulta.