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

13.2.10. Синтаксис подзапроса

13.2.10.1. Подзапрос как Скалярный Операнд
13.2.10.2. Сравнения Используя Подзапросы
13.2.10.3. Подзапросы с ANY, IN, или SOME
13.2.10.4. Подзапросы с ALL
13.2.10.5. Подзапросы строки
13.2.10.6. Подзапросы с EXISTS или NOTEXISTS
13.2.10.7. Связанные подзапросы
13.2.10.8. Подзапросы в FROM Пункт
13.2.10.9. Ошибки подзапроса
13.2.10.10. Оптимизация Подзапросов
13.2.10.11. Перезапись Подзапросов как Соединения

Подзапрос является a SELECT оператор в пределах другого оператора.

Запускаясь с MySQL 4.1, все подформы запросов и операции, которых требует стандарт SQL, поддерживаются, так же как несколько функций, которые специфичны для MySQL.

Вот пример подзапроса:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

В этом примере, SELECT * FROM t1 ... внешний запрос (или внешний оператор), и (SELECT column1 FROM t2) подзапрос. Мы говорим, что подзапрос вкладывается в пределах внешнего запроса, и фактически возможно вложить подзапросы в пределах других подзапросов к значительной глубине. Подзапрос должен всегда появляться в пределах круглых скобок.

Основные преимущества подзапросов:

Вот оператор в качестве примера, который показывает важные пункты о синтаксисе подзапроса как определено стандартом 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, "Подоптимизацию запросов". Для обсуждения ограничений на использование подзапроса, включая проблемы производительности для определенных форм синтаксиса подзапроса, см. Раздел D.4, "Ограничения на Подзапросы".