Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 4 de 416/57 en el curso~12 min
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:

SQL
-- 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.

SQL
-- 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:

SQL
-- 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:

SQL
-- 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

Ejercicio#sql.m4.l4.e1
Intentos: 0Cargando...

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.

Cargando editor...
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

Ejercicio#sql.m4.l4.e2
Intentos: 0Cargando...

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.

Cargando editor...
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