Spec-Zone .ru
спецификации, руководства, описания, API

13.2.10.7. Связанные подзапросы

Связанный подзапрос является подзапросом, который содержит ссылку на таблицу, которая также появляется во внешнем запросе. Например:

SELECT * FROM t1  WHERE column1 = ANY (SELECT column1 FROM t2                       WHERE t2.column2 = t1.column2);

Заметьте, что подзапрос содержит ссылку на столбец t1, даже при том, что подзапрос FROM пункт не упоминает таблицу t1. Так, MySQL смотрит вне подзапроса, и находит t1 во внешнем запросе.

Предположите ту таблицу t1 содержит строку где column1 = 5 и column2 = 6; тем временем, таблица t2 содержит строку где column1 = 5 и column2 = 7. Простое выражение ... WHERE column1 = ANY (SELECT column1 FROM t2) был бы TRUE, но в этом примере, WHERE пункт в пределах подзапроса FALSE (потому что (5,6) не равно (5,7)), таким образом, выражение в целом FALSE.

Правило обзора данных: MySQL оценивает изнутри к внешней стороне. Например:

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));

В этом операторе, x.column2 должен быть столбец в таблице t2 потому что SELECT column1 FROM t2 AS x ... переименовывает t2. Это не столбец в таблице t1 потому что SELECT column1 FROM t1 ... внешний запрос, который дальше отсутствует.

Для подзапросов в HAVING или ORDER BY пункты, MySQL также ищет имена столбцов во внешнем списке выборки.

Для определенных случаев оптимизируется связанный подзапрос. Например:

val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)

Иначе, они неэффективны и вероятны быть медленными. Переписывая запрос, поскольку соединение могло бы улучшить производительность.

Агрегатные функции в связанных подзапросах могут содержать внешние ссылки, если функция содержит только внешние ссылки, и если функция не содержится в другой функции или выражении.