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)
В противном случае они неэффективны и, вероятно, будут медленными. Переписывание запроса как объединения может улучшить производительность.
Агрегатные функции в связанных подзапросах могут содержать внешние ссылки, при условии, что функция содержит только внешние ссылки и что функция не содержится в другой функции или выражении.
© 2025 Oracle
Licensed under the GPLv2 License.