Lecciones del módulo (4/4)
Una consulta dentro de otra: subconsultas
Has aprendido a extraer, filtrar, agrupar, unir y transformar. allí Hay una última idea fundamental: poner una consulta dentro de otra. Estos son Se llaman subconsultas y son el paso que te permite responder preguntas. como "¿quién gana por encima del promedio?" o "¿qué departamentos tienen a alguien asignado a un proyecto?".
La sintaxis básica
Una subconsulta es un SELECT entre paréntesis, utilizado en lugar de un único
valor o una lista de valores en otra consulta:
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);El motor ejecuta primero la subconsulta: SELECT AVG(salary) FROM employees
devuelve un solo número y luego usa ese número en el WHERE externo
como si lo hubieras escrito a mano. Esta es precisamente la ventaja: no
No es necesario conocer el promedio de antemano, SQL lo calcula por usted.
Los tres "tipos" más comunes
1. Subconsulta que devuelve un valor único
El ejemplo anterior: la subconsulta produce una fila, una columna (llamada
escalar). Lo usas con =, >, < y así sucesivamente.
-- Employee with the highest salary:
SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);2. Subconsulta que devuelve una lista
La subconsulta produce una columna, muchas filas. Lo usas con CÓDIGOPH0:
-- Departments that have at least one employee:
SELECT name
FROM departments
WHERE id IN (SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL);3. Subconsulta como "tabla" (DESDE)
Una subconsulta también puede reemplazar una tabla en FROM. Es útil para
precalcule los agregados y luego filtrelos o únalos:
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM departments AS d
JOIN (SELECT department_id, AVG(salary) AS stipendio_medio
FROM employees
GROUP BY department_id) AS medie
ON d.id = medie.department_id
WHERE medie.stipendio_medio > 40000;¿Subconsulta o UNIRSE? Cuando usar cual
A menudo se puede obtener el mismo resultado con un JOIN o con una subconsulta.
Regla de oro:
- Para filtrar filas de una tabla según una propiedad de otra
("empleados cuyos departamentos son..."_),
IN (subquery)es muy legible. - Para combinar columnas de varias tablas en el resultado, utilice
JOIN. - Para calcular un agregado y usarlo como umbral ("por encima del promedio"), la subconsulta escalar es la elección natural.
En la práctica verás ambas cosas: el motor SQL a menudo las optimiza de la misma manera. manera. Elija el formulario que se lea mejor.
Pruébalo
Encuentre el nombre (first_name), el apellido (last_name) y el salario (salario) de los empleados que ganan ESTRICTAMENTE más que el promedio de la empresa. Tres columnas.
Mostrar pista
Reemplazar ? con la subconsulta SELECCIONAR AVG(salario) DE empleados: devuelve un único número para utilizarlo como umbral.
Solución disponible después de 3 intentos
Ejercicio de revisión
Enumere el nombre (departamentos.nombre) de los departamentos que tienen al menos un empleado con un salario estrictamente superior a 50000. Utilice una subconsulta con IN. Ordenar alfabéticamente.
Mostrar pista
La subconsulta interna devuelve los identificadores de los departamentos que tienen empleados con salario> 50000. Luego, WHERE id IN (...) en la consulta externa.
Solución disponible después de 3 intentos