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_departamentocorrespondiente alid_departamentodel 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
den la cláusulaFROM. - La consulta principal une la tabla
empleadoscon la tabla temporaldy 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_departamentocon 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
