Las subconsultas, también conocidas como consultas anidadas, son consultas dentro de otras consultas. Son una herramienta poderosa en SQL que permite realizar consultas complejas y obtener resultados específicos. En este tema, aprenderemos cómo usar subconsultas en las cláusulas SELECT
, FROM
y WHERE
.
Subconsultas en la cláusula SELECT
Las subconsultas en la cláusula SELECT
se utilizan para calcular valores que se mostrarán en el resultado final. Estas subconsultas deben devolver un solo valor (escalar).
Ejemplo:
Supongamos que tenemos dos tablas: empleados
y departamentos
.
Tabla empleados: | id_empleado | nombre | salario | id_departamento | |-------------|----------|---------|-----------------| | 1 | Juan | 5000 | 1 | | 2 | Ana | 6000 | 2 | | 3 | Pedro | 5500 | 1 | | 4 | María | 7000 | 3 |
Tabla departamentos: | id_departamento | nombre_departamento | |-----------------|---------------------| | 1 | Ventas | | 2 | Marketing | | 3 | IT |
Queremos obtener el nombre de cada empleado junto con el nombre de su departamento.
SELECT nombre, (SELECT nombre_departamento FROM departamentos WHERE departamentos.id_departamento = empleados.id_departamento) AS nombre_departamento FROM empleados;
Explicación:
- La subconsulta
(SELECT nombre_departamento FROM departamentos WHERE departamentos.id_departamento = empleados.id_departamento)
se ejecuta para cada fila de la tablaempleados
. - Devuelve el
nombre_departamento
correspondiente alid_departamento
del empleado actual.
Subconsultas en la cláusula FROM
Las subconsultas en la cláusula FROM
se utilizan para crear una tabla temporal que puede ser referenciada en la consulta principal. Esto es útil para simplificar consultas complejas.
Ejemplo:
Queremos obtener el salario promedio de cada departamento y listar los empleados cuyo salario es mayor que el promedio de su departamento.
SELECT e.nombre, e.salario, d.salario_promedio FROM empleados e JOIN (SELECT id_departamento, AVG(salario) AS salario_promedio FROM empleados GROUP BY id_departamento) d ON e.id_departamento = d.id_departamento WHERE e.salario > d.salario_promedio;
Explicación:
- La subconsulta
(SELECT id_departamento, AVG(salario) AS salario_promedio FROM empleados GROUP BY id_departamento)
calcula el salario promedio por departamento. - Esta subconsulta se utiliza como una tabla temporal
d
en la cláusulaFROM
. - La consulta principal une la tabla
empleados
con la tabla temporald
y filtra los empleados cuyo salario es mayor que el promedio de su departamento.
Subconsultas en la cláusula WHERE
Las subconsultas en la cláusula WHERE
se utilizan para filtrar filas basadas en los resultados de otra consulta. Estas subconsultas pueden devolver un solo valor o un conjunto de valores.
Ejemplo:
Queremos listar los empleados que trabajan en el departamento con el salario promedio más alto.
SELECT nombre FROM empleados WHERE id_departamento = ( SELECT id_departamento FROM empleados GROUP BY id_departamento ORDER BY AVG(salario) DESC LIMIT 1 );
Explicación:
- La subconsulta
(SELECT id_departamento FROM empleados GROUP BY id_departamento ORDER BY AVG(salario) DESC LIMIT 1)
encuentra elid_departamento
con el salario promedio más alto. - La consulta principal filtra los empleados que pertenecen a ese departamento.
Ejercicios Prácticos
Ejercicio 1:
Lista los nombres de los empleados cuyo salario es mayor que el salario promedio de todos los empleados.
Ejercicio 2:
Encuentra los nombres de los empleados que trabajan en departamentos donde el salario promedio es mayor que 6000.
SELECT nombre FROM empleados WHERE id_departamento IN ( SELECT id_departamento FROM empleados GROUP BY id_departamento HAVING AVG(salario) > 6000 );
Ejercicio 3:
Lista los nombres de los empleados y el nombre de su departamento, pero solo para aquellos empleados cuyo salario es mayor que el salario promedio de su departamento.
SELECT e.nombre, (SELECT nombre_departamento FROM departamentos WHERE departamentos.id_departamento = e.id_departamento) AS nombre_departamento FROM empleados e WHERE e.salario > ( SELECT AVG(salario) FROM empleados WHERE id_departamento = e.id_departamento );
Conclusión
Las subconsultas son una herramienta poderosa en SQL que permiten realizar consultas complejas y obtener resultados específicos. En este tema, hemos aprendido cómo usar subconsultas en las cláusulas SELECT
, FROM
y WHERE
. Practicar con estos ejemplos y ejercicios te ayudará a dominar el uso de subconsultas en tus propias consultas SQL.
Curso de SQL
Módulo 1: Introducción a SQL
Módulo 2: Consultas básicas de SQL
- Instrucción SELECT
- Filtrando datos con WHERE
- Ordenando datos con ORDER BY
- Limitando resultados con LIMIT
Módulo 3: Trabajando con múltiples tablas
Módulo 4: Filtrado avanzado de datos
- Usando LIKE para coincidencia de patrones
- Operadores IN y BETWEEN
- Valores NULL y IS NULL
- Agregando datos con GROUP BY
- Cláusula HAVING
Módulo 5: Manipulación de datos
Módulo 6: Funciones avanzadas de SQL
Módulo 7: Subconsultas y consultas anidadas
- Introducción a subconsultas
- Subconsultas correlacionadas
- EXISTS y NOT EXISTS
- Usando subconsultas en cláusulas SELECT, FROM y WHERE
Módulo 8: Índices y optimización de rendimiento
- Entendiendo los índices
- Creación y gestión de índices
- Técnicas de optimización de consultas
- Análisis del rendimiento de consultas
Módulo 9: Transacciones y concurrencia
- Introducción a las transacciones
- Propiedades ACID
- Instrucciones de control de transacciones
- Manejo de concurrencia