Spec-Zone.ru › MySQL 5.7

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/correlated-subqueries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API