Una subconsulta correlacionada es una subconsulta que contiene una referencia a una tabla que también aparece en la consulta exterior. Por ejemplo:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
Tenga en cuenta que la subconsulta contiene una referencia a
una columna de t1, incluso aunque la
cláusula FROM de la subconsulta no
menciona una tabla t1. Por lo tanto, MySQL
busca fuera de la subconsulta y encuentra
t1 en la consulta externa.
Suponga que la tabla t1 contiene un
registro en que column1 = 5 y
column2 = 6; mientras, la tabla
t2 contiene un registro en que
column1 = 5 y column2 =
7. La expresión ... WHERE column1 = ANY
(SELECT column1 FROM t2) sería
TRUE, pero en este ejemplo, la cláusula
WHERE dentro de la subconsulta es
FALSE (ya que (5,6) no
es igual a (5,7)), así que la subconsulta
como un todo es FALSE.
Regla de visibilidad: MySQL evalúa desde dentro hacia fuera. Por ejemplo:
SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
En este comando, x.column2 debe ser una
columna en la tabla t2 ya que
SELECT column1 FROM t2 AS x ... renombra
t2. No hay una columna en la tabla
t1 porque SELECT column1 FROM t1
... es una consulta externa que está
demasiado afuera.
Para subconsultas en cláusulas HAVING u
ORDER BY , MySQL busca nombres de columna
en la lista de selección exterior.
Para ciertos casos, una subconsulta correlacionada es óptima. Por ejemplo:
valIN (SELECTkey_valFROMtbl_nameWHEREcorrelated_condition)
De otro modo, son ineficientes y lentas. Reescribir la consulta como un join puede mejorar el rendimiento.
Las subconsultas correlacionadas no pueden referirse a los resultados de funciones agregadas de la consulta exterior.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
