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.