Вложенные запросы (SQL Server)
Статья
30.12.2022
Чтение занимает 20 мин
Участники: 11
Обратная связь
Область применения: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Analytics Platform System (PDW)
Вложенный запрос — это запрос, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса.
Примечание
В примерах из этой статьи используется база данных AdventureWorks2016. Образцы баз данных AdventureWorks можно скачать здесь.
Подзапрос может быть использован везде, где разрешены выражения. В этом примере вложенный запрос используется в качестве выражения столбца с именем MaxUnitPrice в операторе SELECT .
SQLКопировать
USE AdventureWorks2016;
GO
SELECT Ord.SalesOrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Sales.SalesOrderDetail AS OrdDet
WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice
FROM Sales.SalesOrderHeader AS Ord;
GO
Основы вложенных запросов
Вложенный запрос по-другому называют внутренним запросом или внутренней операцией выбора, в то время как инструкцию, содержащую вложенный запрос, называют внешним запросом или внешней операцией выбора.
Многие инструкции Transact-SQL, включающие вложенные запросы, можно также сформулировать как соединения. Другие запросы могут быть осуществлены только с помощью подзапросов. В Transact-SQL обычно нет разницы в производительности между инструкцией, которая включает вложенный запрос, и семантически эквивалентной версией, которая этого не делает. Сведения об архитектуре обработки запросов SQL Server см. в разделе Обработка инструкций SQL. Однако в некоторых случаях, когда проверяется существование, соединения показывают лучшую производительность. В противном случае для устранения дубликатов вложенный запрос должен обрабатываться для получения каждого результата внешнего запроса. В таких случаях метод работы соединений дает лучшие результаты.
В следующем примере показаны вложенный запрос SELECT и соединение SELECT , возвращающие один и тот же результирующий набор и план выполнения:
SQLКопировать
USE AdventureWorks2016;
GO
/* SELECT statement built using a subquery. */
SELECT [Name]
FROM Production.Product
WHERE ListPrice =
(SELECT ListPrice
FROM Production.Product
WHERE [Name] = 'Chainring Bolts' );
GO
/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.[Name]
FROM Production.Product AS Prd1
JOIN Production.Product AS Prd2
ON (Prd1.ListPrice = Prd2.ListPrice)
WHERE Prd2.[Name] = 'Chainring Bolts';
GO
Вложенный во внешнюю инструкцию SELECT запрос, имеет следующие компоненты:
обычный запрос SELECT, включающий обычные компоненты списка выборки;
обычное предложение FROM, включающее одно или несколько имен таблиц или представлений.
Необязательное предложение WHERE.
Необязательное предложение GROUP BY.
Необязательное предложение HAVING.
Запрос SELECT вложенного запроса всегда заключен в скобки. Он не может включать COMPUTE предложение или FOR BROWSE и может включать ORDER BY предложение только при указании предложения TOP.
Вложенный запрос может быть включен в предложение WHERE или HAVING внешней инструкции SELECT, INSERT, UPDATE или DELETE или в другой вложенный запрос. Возможно создавать вложенность до 32-го уровня, хотя ограничения меняются в зависимости от объема доступной памяти и сложности других выражений в запросе. Отдельные запросы могут не поддерживать вложенность до 32-го уровня. Подзапрос может появляться везде, где может использоваться выражение, если он возвращает одно значение.
Если таблица отображается только во вложенном запросе, а не во внешнем запросе, то столбцы из этой таблицы не могут быть включены в выходные данные (список выбора внешнего запроса).
Инструкции, включающие вложенные запросы, обычно имеют один из следующих форматов:
WHERE expression [NOT] IN (subquery)
WHERE expression comparison_operator [ANY | ALL] (subquery)
WHERE [NOT] EXISTS (subquery)
В некоторых инструкциях Transact-SQL вложенный запрос может быть оценен как независимый запрос. По сути, результаты вложенных запросов подставляются во внешний запрос (хотя это необязательно то, как SQL Server фактически обрабатывает инструкции Transact-SQL с вложенными запросами).
Существуют три основных типа подзапросов, которые:
работают в списках, указанных с помощью ключевого слова IN, или тех, которые оператор сравнения изменил с помощью ключевого слова ANY или ALL;
вставлены оператором немодифицированных сравнений и должны возвращать одно значение;
являются проверками на существование, начинающимися с ключевого слова EXISTS.
Do'stlaringiz bilan baham: |