0Pricing
SQL Academy · Lección

Subconsultas correlacionadas

Una subconsulta que depende de la fila externa

Subconsultas correlacionadas es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué es una subconsulta correlacionada?

Una subconsulta correlacionada es una subconsulta que hace referencia a una columna de la consulta externa (que la contiene). A diferencia de una subconsulta normal, que se ejecuta una vez y devuelve un resultado fijo, una subconsulta correlacionada se evalúa una vez por cada fila procesada por la consulta externa.

Esto las hace muy útiles para comparaciones fila por fila, pero también más costosas que las subconsultas simples.

Subconsulta simple frente a correlacionada

La diferencia principal es la siguiente: una subconsulta normal no hace referencia a la consulta externa y puede funcionar de forma independiente. Una subconsulta correlacionada depende de la fila externa; puede ver el alias de la tabla externa dentro de la subconsulta.

En el ejemplo siguiente, el SELECT interno hace referencia a e1.department_id de la consulta externa, lo que crea la correlación.

-- Regular subquery (runs once)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Correlated subquery (runs once per outer row)
SELECT name, salary, department_id
FROM employees e1
WHERE salary > (
  SELECT AVG(salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

Configuración de las tablas de ejemplo

Creemos dos tablas que usaremos durante toda esta lección: employees y departments. Contienen datos realistas para demostrar las subconsultas correlacionadas en distintos escenarios.

CREATE TABLE departments (
  id   INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE employees (
  id            INT PRIMARY KEY,
  name          VARCHAR(50),
  department_id INT REFERENCES departments(id),
  salary        NUMERIC(10,2),
  hire_date     DATE
);

INSERT INTO departments VALUES (1,'Engineering'),(2,'Sales'),(3,'HR');

INSERT INTO employees VALUES
  (1,'Alice',  1, 90000, '2020-03-01'),
  (2,'Bob',    1, 75000, '2021-06-15'),
  (3,'Carol',  2, 60000, '2019-01-10'),
  (4,'David',  2, 68000, '2022-09-01'),
  (5,'Eve',    3, 55000, '2020-07-20'),
  (6,'Frank',  1, 95000, '2018-11-05'),
  (7,'Grace',  3, 52000, '2023-02-28'),
  (8,'Henry',  2, 71000, '2021-04-12');

Empleados que ganan más que el promedio de su departamento

Un caso de uso clásico de las subconsultas correlacionadas es encontrar todos los empleados cuyo salario supera el salario promedio de su propio departamento. La consulta interna vuelve a calcular el promedio del departamento para cada fila de empleado de la consulta externa.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id, e1.salary DESC;

Uso de subconsultas correlacionadas en SELECT

Las subconsultas correlacionadas no se limitan a la cláusula WHERE; también pueden aparecer en la lista SELECT para calcular un valor para cada fila. Aquí obtenemos el salario de cada empleado junto con el salario promedio de su departamento, todo en una sola consulta.

SELECT
  e.name,
  e.salary,
  (
    SELECT ROUND(AVG(e2.salary), 2)
    FROM employees e2
    WHERE e2.department_id = e.department_id
  ) AS dept_avg_salary
FROM employees e
ORDER BY e.department_id, e.name;

Cómo encontrar al empleado mejor pagado de cada departamento

Podemos usar una subconsulta correlacionada para encontrar al empleado con el salario máximo de cada departamento. La consulta interna busca el salario máximo del departamento de la fila actual, y la consulta externa conserva únicamente la fila que coincide con él.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary = (
  SELECT MAX(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id;

EXISTS con una subconsulta correlacionada

El operador EXISTS se combina con frecuencia con subconsultas correlacionadas. Devuelve TRUE si la consulta interna produce al menos una fila. Aquí enumeramos todos los departamentos que tienen al menos un empleado contratado antes de 2021.

SELECT d.name AS department
FROM departments d
WHERE EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
    AND e.hire_date < '2021-01-01'
);

NOT EXISTS con una subconsulta correlacionada

NOT EXISTS es lo contrario: devuelve TRUE cuando la subconsulta correlacionada no encuentra ninguna fila coincidente. Esto resulta útil para encontrar registros principales que no tienen registros secundarios, como departamentos sin empleados.

SELECT d.name AS department_without_employees
FROM departments d
WHERE NOT EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
);

Subconsulta correlacionada en UPDATE

Las subconsultas correlacionadas también funcionan dentro de las instrucciones UPDATE. El ejemplo siguiente añade una columna dept_avg y luego utiliza una subconsulta correlacionada para rellenarla con el salario promedio del departamento de cada empleado.

ALTER TABLE employees ADD COLUMN dept_avg NUMERIC(10,2);

UPDATE employees e1
SET dept_avg = (
  SELECT ROUND(AVG(e2.salary), 2)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, dept_avg FROM employees ORDER BY department_id, name;

Subconsulta correlacionada en DELETE

También puede usar una subconsulta correlacionada en una instrucción DELETE para eliminar filas basándose en datos de una tabla relacionada. La consulta siguiente elimina los empleados cuyo salario es inferior al 60 % del promedio de su departamento, un patrón de limpieza de datos.

DELETE FROM employees e1
WHERE e1.salary < (
  SELECT AVG(e2.salary) * 0.60
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, department_id FROM employees ORDER BY department_id;

Consejo de rendimiento: subconsulta correlacionada frente a JOIN

Las subconsultas correlacionadas se ejecutan una vez por cada fila externa, lo que puede ser lento en tablas grandes. Muchas subconsultas correlacionadas se pueden reescribir como un JOIN con una tabla derivada o una CTE para mejorar el rendimiento. Comprenda ambos patrones y elija en función de la legibilidad y del plan de ejecución.

-- Correlated version (potentially slower)
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

-- Equivalent JOIN + derived table (often faster)
SELECT e.name, e.salary
FROM employees e
JOIN (
  SELECT department_id, AVG(salary) AS avg_sal
  FROM employees
  GROUP BY department_id
) dept_avg ON dept_avg.department_id = e.department_id
WHERE e.salary > dept_avg.avg_sal;

Comprobación rápida

Compruebe cuánto ha entendido sobre las subconsultas correlacionadas.

Resumen: subconsultas correlacionadas

En esta lección aprendió que una subconsulta correlacionada hace referencia a una columna de su consulta externa y se vuelve a evaluar para cada fila externa. Conclusiones principales:

  • Pueden aparecer en SELECT, WHERE, UPDATE y DELETE.
  • EXISTS / NOT EXISTS se combinan de forma natural con las subconsultas correlacionadas para comprobar si existen filas relacionadas.
  • Son expresivas, pero pueden ser lentas; considere reescribirlas como un JOIN cuando el rendimiento sea importante.
  • El alias de la tabla externa dentro de la subconsulta es lo que crea la correlación.

Preguntas frecuentes

¿La lección «Subconsultas correlacionadas» es gratis?

Sí — el texto completo de «Subconsultas correlacionadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Subconsultas correlacionadas»?

Una subconsulta que depende de la fila externa Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Subconsultas correlacionadas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Subconsultas correlacionadas
  2. EXISTS y NOT EXISTS
  3. IN frente a ANY frente a ALL
  4. Rendimiento de EXISTS frente a JOIN
← Volver a SQL Academy