Puedes ejecutar cualquier subconsulta en nuestra consola interactiva: Abrir consola SQL →
Subconsultas en SQL: potencia tus consultas con lógica interna
Una subconsulta es una consulta dentro de otra consulta. Permite resolver problemas complejos, filtrar datos dinámicamente y crear condiciones avanzadas.
Tabla de contenidos
1. ¿Qué es una subconsulta?
Una subconsulta es una consulta que se ejecuta dentro de otra. SQL evalúa primero la subconsulta y luego usa su resultado en la consulta principal.
SELECT nombre FROM usuarios
WHERE id IN (SELECT usuario_id FROM pedidos);
2. Subconsultas con IN
SELECT nombre FROM usuarios
WHERE id IN (
SELECT usuario_id FROM pedidos
);
3. Subconsultas en WHERE
SELECT * FROM productos
WHERE precio > (
SELECT AVG(precio) FROM productos
);
4. Subconsultas en SELECT
SELECT nombre,
(SELECT COUNT(*) FROM pedidos WHERE usuario_id = usuarios.id) AS total_pedidos
FROM usuarios;
5. Subconsultas en FROM
Puedes usar subconsultas como si fueran tablas temporales.
SELECT ciudad, promedio
FROM (
SELECT ciudad, AVG(edad) AS promedio
FROM usuarios
GROUP BY ciudad
) AS tabla_temp;
6. Ejemplos prácticos
SELECT * FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados);
SELECT nombre FROM usuarios
WHERE id IN (SELECT usuario_id FROM pedidos WHERE estado = 'Enviado');
SELECT producto, precio,
(SELECT MAX(precio) FROM productos) AS precio_maximo
FROM productos;
7. Ejercicios para practicar
- Filtra usuarios que tengan pedidos.
- Filtra productos más caros que el promedio.
- Muestra usuarios con su número de pedidos.
- Crea una tabla temporal con promedios por ciudad.
- Explica para qué sirven las subconsultas.
SELECT nombre FROM usuarios
WHERE id IN (SELECT usuario_id FROM pedidos);
SELECT * FROM productos
WHERE precio > (SELECT AVG(precio) FROM productos);
SELECT nombre,
(SELECT COUNT(*) FROM pedidos WHERE usuario_id = usuarios.id) AS total_pedidos
FROM usuarios;
SELECT ciudad, promedio
FROM (
SELECT ciudad, AVG(edad) AS promedio
FROM usuarios
GROUP BY ciudad
) AS tabla_temp;
-- Sirven para crear lógica avanzada dentro de consultas.
8. Mini‑proyecto: Usuarios con pedidos enviados
CREATE TABLE pedidos (
id INT PRIMARY KEY,
usuario_id INT,
estado VARCHAR(50)
);
INSERT INTO pedidos VALUES
(1, 1, 'Enviado'),
(2, 1, 'Pendiente'),
(3, 2, 'Enviado');
SELECT nombre FROM usuarios
WHERE id IN (
SELECT usuario_id FROM pedidos WHERE estado = 'Enviado'
);
9. Errores comunes
- Usar subconsultas cuando un JOIN sería más eficiente.
- Olvidar alias en subconsultas dentro de FROM.
- Crear subconsultas que devuelven múltiples columnas donde solo se permite una.
- Confundir IN con = en subconsultas.
10. Preguntas frecuentes
¿Son mejores que los JOIN?
Depende del caso; a veces JOIN es más eficiente.
¿Puedo anidar subconsultas?
Sí, pero no abuses: puede volverse difícil de leer.