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.