Spec-Zone .ru
спецификации, руководства, описания, API
|
ANY
, IN
, или SOME
ALL
EXISTS
или NOTEXISTS
FROM
Пункт Подзапрос является a SELECT
оператор в пределах другого оператора.
Запускаясь с MySQL 4.1, все подформы запросов и операции, которых требует стандарт SQL, поддерживаются, так же как несколько функций, которые специфичны для MySQL.
Вот пример подзапроса:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
В этом примере, SELECT * FROM t1 ...
внешний запрос
(или внешний оператор), и (SELECT column1 FROM
t2)
подзапрос. Мы говорим, что подзапрос вкладывается в пределах внешнего запроса, и фактически возможно вложить
подзапросы в пределах других подзапросов к значительной глубине. Подзапрос должен всегда появляться в пределах
круглых скобок.
Основные преимущества подзапросов:
Они позволяют запросы, которые структурируются так, чтобы было возможно изолировать каждую часть оператора.
Они обеспечивают альтернативные способы выполнить операции, которые иначе потребовали бы сложных соединений и объединений.
Много людей считают подзапросы более читаемыми чем сложные соединения или объединения. Действительно, это было новшество подзапросов, которые дали людям исходную идею вызвать ранний SQL "Язык структурированных запросов."
Вот оператор в качестве примера, который показывает важные пункты о синтаксисе подзапроса как определено стандартом SQL и поддерживаемый в MySQL:
DELETE FROM t1WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
Подзапрос может возвратить скаляр (единственное значение), единственная строка, единственный столбец, или таблица (одна или более строк одного или более столбцов). Их вызывают скаляром, столбцом, строкой, и табличными подзапросами. Подзапросы, которые возвращают определенный вид результата часто, могут использоваться только в определенных контекстах, как описано в следующих разделах.
Есть немного ограничений на тип операторов, в которых могут использоваться подзапросы. Подзапрос может содержать
многие из ключевых слов или пунктов что дежурное блюдо SELECT
может содержать: DISTINCT
, GROUP BY
, ORDER BY
, LIMIT
, соединения, индексируйте подсказки,
UNION
конструкции, комментарии, функции, и так далее.
Внешний оператор подзапроса может быть любым из: SELECT
, INSERT
,
UPDATE
,
DELETE
,
SET
,
или DO
.
В MySQL невозможно изменить таблицу и выбрать из той же самой таблицы в подзапросе. Это применяется к операторам
такой как DELETE
,
INSERT
,
REPLACE
, UPDATE
, и (потому что подзапросы могут использоваться в SET
пункт) LOAD
DATA INFILE
.
Для получения информации о как подзапросы дескрипторов оптимизатора, см. Раздел 8.13.16, "Подоптимизацию запросов". Для обсуждения ограничений на использование подзапроса, включая проблемы производительности для определенных форм синтаксиса подзапроса, см. Раздел E.4, "Ограничения на Подзапросы".