15.2.15 Подзапросы
- 15.2.15.1 Подзапрос как скалярный операнд
- 15.2.15.2 Сравнения с использованием подзапросов
- 15.2.15.3 Подзапросы с ANY, IN или SOME
- 15.2.15.4 Подзапросы с ALL
- 15.2.15.5 Подзапросы с строкой
- 15.2.15.6 Подзапросы с EXISTS или NOT EXISTS
- 15.2.15.7 Связанные подзапросы
- 15.2.15.8 Выраженные таблицы
- 15.2.15.9 Латеральные выраженные таблицы
- 15.2.15.10 Ошибки подзапросов
- 15.2.15.11 Оптимизация подзапросов
- 15.2.15.12 Ограничения на подзапросы
Подзапрос — это оператор SELECT внутри другого оператора.
Поддерживаются все формы подзапросов и операции, требуемые стандартом SQL, а также некоторые особенности, специфичные для MySQL.
Вот пример подзапроса:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
В этом примере SELECT * FROM t1 ... является внешним запросом (или внешним оператором), а (SELECT column1 FROM
t2) — подзапросом. Мы говорим, что подзапрос вложен во внешний запрос, и, фактически, можно вкладывать подзапросы в другие подзапросы на значительную глубину. Подзапрос всегда должен быть заключён в скобки.
Основные преимущества подзапросов:
Они позволяют создавать запросы, которые структурированы таким образом, что можно изолировать каждую часть оператора.
Они обеспечивают альтернативные способы выполнения операций, которые в противном случае потребовали бы сложных соединений и объединений.
Многие считают подзапросы более удобочитаемыми, чем сложные соединения или объединения. Действительно, именно инновация подзапросов дала людям первоначальную идею называть ранние SQL “Структурированный язык запросов”.
Вот пример оператора, который демонстрирует основные моменты синтаксиса подзапроса, как указано в стандарте SQL и поддерживается в MySQL:
DELETE FROM t1
WHERE 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, комментарии, функции и так далее.
Операторы TABLE и VALUES можно использовать в подзапросах. Подзапросы, использующие VALUES, обычно являются более подробными версиями подзапросов, которые можно переписать более компактно, используя запись множеств или с SELECT или TABLE синтаксисом; предполагая, что таблица ts создана с помощью оператора CREATE TABLE
ts VALUES ROW(2), ROW(4), ROW(6), представленные здесь операторы эквивалентны:
SELECT * FROM tt
WHERE b > ANY (VALUES ROW(2), ROW(4), ROW(6));
SELECT * FROM tt
WHERE b > ANY (SELECT * FROM ts);
SELECT * FROM tt
WHERE b > ANY (TABLE ts);
Примеры подзапросов TABLE показаны в следующих разделах.
Внешний оператор подзапроса может быть любым из: SELECT, INSERT, UPDATE, DELETE, SET или DO.
Сведения о том, как оптимизатор обрабатывает подзапросы, см. в Разделе 10.2.2, «Оптимизация подзапросов, выраженных таблиц, ссылок на представления и общих табличных выражений». Обсуждение ограничений на использование подзапросов, включая проблемы производительности для некоторых форм синтаксиса подзапросов, см. в Разделе 15.2.15.12, «Ограничения на подзапросы».
© 2025 Oracle
Licensed under the GPLv2 License.