0Pricing
SQL Interview Prep · Lección

Anatomía de una subconsulta correlacionada

Descubra cómo la consulta interna hace referencia a la fila externa y conozca el modelo de ejecución por fila

Anatomía de una subconsulta correlacionada es una lección gratuita de SQL Interview Prep 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 Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Qué hace que una subconsulta sea correlacionada

Los entrevistadores dividen las subconsultas en dos categorías. Una subconsulta simple (no correlacionada) puede ejecutarse por sí sola. Una subconsulta correlacionada hace referencia a una columna de la consulta externa, por lo que no puede ejecutarse de forma independiente.

  • No correlacionada: se evalúa una vez y su resultado se reutiliza para cada fila externa.
  • Correlacionada: se vuelve a evaluar una vez por cada fila externa, porque depende de esa fila.

La señal inequívoca es que una columna de la tabla externa aparece dentro de la consulta interna. Si la detecta, podrá identificar el patrón al instante.

El modelo de ejecución por fila

Imagine que el motor recorre las filas externas. Para cada fila externa, introduce sus valores en la consulta interna, la ejecuta y utiliza el resultado para decidir algo o calcularlo.

Este es el modelo mental que los entrevistadores esperan que explique: "la consulta interna se ejecuta una vez por cada fila externa".

Esa formulación también anticipa la pregunta de seguimiento clásica: las subconsultas correlacionadas pueden ser lentas porque la consulta interna podría ejecutarse miles de veces. Lo solucionaremos en la lección 4.

Cómo detectar la referencia externa

Aquí, employees y el alias externo para empleados asalariados e1 controlan una consulta interna que lee e1.dept_id. Esa referencia a la fila externa es la correlación.

Si elimina el prefijo del alias, la consulta interna deja de compilar por sí sola. Esa dependencia es precisamente lo que la hace correlacionada.

SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Leer la consulta en voz alta

Traduzca la consulta anterior al inglés cotidiano, como lo haría en una entrevista:

"Para cada empleado e1, busque el salario promedio de su propio departamento y conserve al empleado solo si gana más que ese promedio del departamento."

La cláusula WHERE e2.dept_id = e1.dept_id de la consulta interna vincula el promedio con el departamento de este empleado. Sin esa línea, compararía a todos con el promedio de toda la empresa.

Los alias son obligatorios

Cuando la consulta interna y la externa acceden a la misma tabla, debe asignar un alias a ambas para que el motor sepa a qué fila pertenece cada columna.

  • e1 = la fila externa que se está comprobando.
  • e2 = el recorrido interno de la tabla.

Si elimina los alias, dept_id se vuelve ambiguo; muchos motores lo vincularán silenciosamente con la tabla interna y romperán la correlación. Los entrevistadores suelen incluir exactamente este error.

Subconsulta correlacionada en SELECT

Las subconsultas correlacionadas no se limitan a WHERE. En una lista SELECT, producen una columna calculada que también se evalúa para cada fila externa.

A continuación, cada pedido muestra cuántos pedidos más realizó el mismo cliente. El recuento interno está correlacionado mediante o.customer_id.

SELECT o.order_id,
       o.customer_id,
       (SELECT COUNT(*)
        FROM orders o2
        WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;

Escalar significa exactamente un valor

Una subconsulta correlacionada utilizada en SELECT o comparada con =, >, < debe devolver un único valor escalar por cada fila externa.

Si devuelve más de una fila, la base de datos genera un error como "subquery returns more than one row."

Las funciones de agregación como COUNT, MAX o AVG garantizan un único valor, por lo que son habituales dentro de subconsultas correlacionadas escalares. Conocer esta regla evita una sorpresa frecuente durante la ejecución.

Cuando la subconsulta devuelve NULL

Una subconsulta correlacionada escalar puede coincidir con cero filas internas. En ese caso, una función de agregación devuelve NULL (o, en el caso de COUNT, devuelve 0).

Ese NULL se propaga a la expresión externa. Las comparaciones con NULL producen UNKNOWN, por lo que la fila externa puede quedar excluida silenciosamente.

Si necesita un valor alternativo, envuelva la subconsulta en COALESCE. A los entrevistadores les gusta preguntar qué ocurre cuando no coincide ninguna fila interna y esperan que mencione el comportamiento de NULL.

SELECT c.customer_id,
       COALESCE((SELECT MAX(o.amount)
                 FROM orders o
                 WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;

Ejemplo resuelto: fecha del pedido más reciente

Una tarea habitual: mostrar cada cliente junto con la fecha de su pedido más reciente. Una subconsulta correlacionada en SELECT lo resuelve directamente.

Para cada fila de cliente, la consulta interna encuentra la fecha máxima del pedido de ese cliente mediante o.customer_id = c.customer_id.

SELECT c.customer_id,
       c.name,
       (SELECT MAX(o.order_date)
        FROM orders o
        WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;

Por qué puede ser lenta

Como la consulta interna se ejecuta una vez por cada fila externa, una subconsulta correlacionada sobre una tabla externa grande puede provocar millones de ejecuciones internas.

  • Un índice en la columna correlacionada (aquí, orders.customer_id) permite que cada ejecución interna termine rápidamente.
  • Sin un índice, cada ejecución puede recorrer toda la tabla, lo que produce aproximadamente un trabajo O(n*m).

En las entrevistas, mencione siempre el índice y la reescritura como JOIN como sus herramientas para mejorar el rendimiento.

Correlacionada y no correlacionada, lado a lado

La diferencia está en una sola línea. La versión no correlacionada compara a todos con el promedio de la empresa; la versión correlacionada compara a cada persona con su propio departamento.

Lea ambas y observe cómo la única línea WHERE e2.dept_id = e1.dept_id cambia por completo el significado.

-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary) FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Comprobación rápida

Compruebe cuánto entiende de lo que define una subconsulta correlacionada.

Recapitulación: anatomía de una subconsulta correlacionada

Conclusiones clave:

  • Una subconsulta correlacionada hace referencia a la fila externa y se ejecuta una vez por cada fila externa.
  • Asigne un alias a ambas tablas cuando se trate de la misma tabla para que la correlación no sea ambigua.
  • El uso escalar debe devolver exactamente un valor; si no hay coincidencias, devuelve NULL, por lo que debe protegerlo con COALESCE.
  • Puede aparecer en SELECT o WHERE, y su rendimiento depende de la indexación de la columna correlacionada.

Diga "se ejecuta una vez por cada fila externa" en la entrevista y habrá expresado el concepto central correctamente.

Preguntas frecuentes

¿La lección «Anatomía de una subconsulta correlacionada» es gratis?

Sí — el texto completo de «Anatomía de una subconsulta correlacionada» 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 Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Anatomía de una subconsulta correlacionada»?

Descubra cómo la consulta interna hace referencia a la fila externa y conozca el modelo de ejecución por fila Practicas SQL Interview Prep 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 Interview Prep?

No se requiere experiencia previa. SQL Interview Prep 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 «Anatomía de una subconsulta correlacionada»?

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 Interview Prep?

Sí. Cada lección de SQL Interview Prep 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. Anatomía de una subconsulta correlacionada
  2. Agregaciones por grupo sin GROUP BY
  3. EXISTS y NOT EXISTS correlacionados
  4. Reescribir subconsultas correlacionadas como joins
← Volver a SQL Interview Prep