Spec-Zone.ru › MySQL 8.4

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/subqueries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API