Subconsultas correlacionadas

Todas las subconsultas que hemos visto hasta ahora eran no correlacionadas (independientes). Podían ejecutarse de forma autónoma respecto a la consulta principal, y podíamos ver qué devolvían antes de usar su resultado en la consulta principal. Las subconsultas correlacionadas, en cambio, hacen referencia a una o varias columnas de la consulta principal.

Ejemplo de subconsulta correlacionada

Por ejemplo, la siguiente subconsulta correlacionada calcula quién ha gastado y cuánto:

MySQL 8.4
SELECT FamilyMembers.member_name, (
    SELECT SUM(Payments.unit_price * Payments.amount)
    FROM Payments
    WHERE Payments.family_member = FamilyMembers.member_id
) AS total_spent
FROM FamilyMembers;
member_nametotal_spent
Headley Quincey2504
Flavia Quincey74194
Andie Quincey3600
Lela Quincey650
Annie Quincey1060
Ernest Forrest<NULL>
Constance Forrest<NULL>
Wednesday Addams<NULL>

En este caso, la subconsulta correlacionada hace referencia a la columna member_id de la consulta principal.

Una subconsulta correlacionada se diferencia de una no correlacionada en que no se ejecuta una sola vez antes de la consulta en la que está anidada, sino para cada fila que puede entrar en el resultado final.

Así, en nuestro caso, la consulta principal a la tabla FamilyMembers devuelve 8 registros, y para cada uno de ellos se ejecuta la subconsulta correlacionada.

Impacto en el rendimiento

Ten en cuenta que las subconsultas correlacionadas pueden causar problemas de rendimiento, sobre todo si la consulta que las contiene devuelve muchas filas, ya que la subconsulta correlacionada se ejecutará por separado para cada una de esas filas.