Spec-Zone.ru › MySQL 5.7

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 или NOT EXISTS
  • 13.2.10.7 Связанные подзапросы
  • 13.2.10.8 Выводимые таблицы
  • 13.2.10.9 Ошибки подзапросов
  • 13.2.10.10 Оптимизация подзапросов
  • 13.2.10.11 Перезапись подзапросов в виде объединений
  • 13.2.10.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 конструкции, комментарии, функции и так далее.

Внешний оператор подзапроса может быть любым из: SELECT, INSERT, UPDATE, DELETE, SET или DO.

В MySQL нельзя изменять таблицу и выбирать из той же таблицы в подзапросе. Это относится к операторам, таким как DELETE, INSERT, REPLACE, UPDATE и (поскольку подзапросы могут использоваться в SET предложении) LOAD DATA.

Информацию о том, как оптимизатор обрабатывает подзапросы, см. в разделе 8.2.2, «Оптимизация подзапросов, производных таблиц и ссылок на представления». Обсуждение ограничений на использование подзапросов, включая вопросы производительности для определенных форм синтаксиса подзапросов, см. в разделе 13.2.10.12, «Ограничения на подзапросы».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/subqueries.html

Spec-Zone.ru

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