Spec-Zone .ru
спецификации, руководства, описания, API
|
Связанный подзапрос является подзапросом, который содержит ссылку на таблицу, которая также появляется во внешнем запросе. Например:
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 (SELECTkey_val
FROMtbl_name
WHEREcorrelated_condition
)
Иначе, они неэффективны и вероятны быть медленными. Переписывая запрос, поскольку соединение могло бы улучшить производительность.
Агрегатные функции в связанных подзапросах могут содержать внешние ссылки, если функция содержит только внешние ссылки, и если функция не содержится в другой функции или выражении.