TOP (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW)в Microsoft FabricХранилище в базе данных Microsoft FabricSQL в Microsoft Fabric
Ограничивает число строк, возвращаемых в результирующем наборе запроса до заданного числа или процентного значения в SQL Server. При использовании TOP
с предложением ORDER BY
результирующий набор ограничен первым n число упорядоченных строк. В противном случае TOP
возвращает первое n число строк в неопределенном порядке. Используйте это предложение, чтобы указать количество строк, возвращаемых из инструкции SELECT
. Или используйте TOP
, чтобы указать строки, затронутые INSERT
, UPDATE
, MERGE
или инструкцией DELETE
.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server и Базы данных SQL Azure:
[
TOP (expression) [ PERCENT ]
[ WITH TIES ]
]
Синтаксис для системы платформы Azure Synapse Analytics и Analytics (PDW):
[
TOP ( expression )
[ WITH TIES ]
]
Аргументы
выражение
Числовое выражение, определяющее количество возвращаемых строк. выражения
ПРОЦЕНТ
Указывает на то, что запрос возвращает только первые expression процентов строк из результирующего набора. Дробные значения округляются до следующего целого числа.
WITH TIES
Возвращает две или более строки, которые соперничают за последнее место в ограниченном результирующем наборе. Этот аргумент необходимо использовать с предложением ORDER BY
.
WITH TIES
может привести к возврату больше строк, чем значение, указанное в выражении. Например, если для выражения
Можно указать предложение TOP
с аргументом WITH TIES
только в операторах SELECT
и только в том случае, если также указать предложение ORDER BY
. Порядок возврата связанных записей произволен.
ORDER BY
не влияет на это правило.
Рекомендации
В инструкции SELECT
всегда используйте предложение ORDER BY
с предложением TOP
. Это единственный способ прогнозировать, какие строки влияют на TOP
.
Используйте OFFSET
и FETCH
в предложении ORDER BY
вместо предложения TOP
для реализации решения по страницам запроса. Решение по страницам (то есть отправка блоков или страниц данных клиенту) упрощает реализацию предложений OFFSET
и FETCH
. Дополнительные сведения см. в предложении SELECT — ORDER BY.
Используйте TOP
(или OFFSET
и FETCH
) вместо SET ROWCOUNT
, чтобы ограничить количество возвращаемых строк. Эти методы предпочтительнее использовать SET ROWCOUNT
по следующим причинам:
- В рамках инструкции
SELECT
оптимизатор запросов может рассмотреть значение выражения в предложенияхTOP
илиFETCH
во время оптимизации запросов. Так как вы используетеSET ROWCOUNT
за пределами инструкции, которая выполняет запрос, его значение не может рассматриваться в плане запроса.
Поддержка совместимости
Для обратной совместимости круглые скобки являются необязательными в SELECT
операторах, если выражение является целочисленной константой. Мы рекомендуем всегда использовать скобки для TOP
в инструкциях SELECT
. Это обеспечивает согласованность с необходимым использованием в инструкциях INSERT
, UPDATE
, MERGE
и DELETE
.
Совместимость
Выражение TOP
не влияет на инструкции, которые могут выполняться из-за триггера. Таблицы inserted
и deleted
в триггерах возвращают только строки, которые действительно влияют на INSERT
, UPDATE
, MERGE
или операторы DELETE
. Например, если INSERT TRIGGER
возникает в результате INSERT
инструкции, которая использовала предложение TOP
.
то SQL Server позволяет обновлять строки через представления. Так как в определении представления можно включить предложение TOP
, некоторые строки могут исчезнуть из представления, если строки больше не соответствуют требованиям выражения TOP
из-за обновления.
При указании в инструкции MERGE
предложение TOP
применяется после всей исходной таблицы и соединения всей целевой таблицы. а также удаления соединенных строк, которые не соответствуют требованиям к вставке, обновлению или удалению. Предложение TOP
дополнительно сокращает количество присоединенных строк к указанному значению, а действия вставки, обновления или удаления применяются к оставшимся присоединенным строкам неупорядоченным способом. То есть нет порядка, в котором строки распределяются между действиями, определенными в предложениях WHEN
. Например, если указание TOP (10)
влияет на 10 строк, можно обновить семь этих строк и три вставки. Или можно удалить, пять обновленных и четыре вставленных и т. д. Так как инструкция MERGE
выполняет полную проверку таблицы исходных и целевых таблиц, производительность ввода-вывода может повлиять на использование предложения TOP
для изменения большой таблицы путем создания нескольких пакетов. В этом случае необходимо сделать так, чтобы все последующие пакеты содержали только новые строки.
Используйте осторожность при указании предложения TOP
в запросе, который содержит оператор UNION
, UNION ALL
, EXCEPT
или INTERSECT
. Можно написать запрос, возвращающий непредвиденные результаты, так как порядок, в котором предложения TOP
и ORDER BY
логически обрабатываются, не всегда интуитивно понятны, когда эти операторы используются в операции выбора. Например, исходя из следующих таблиц и данных, предположим, что необходимо вернуть самый недорогой красный и синий автомобили. Иными словами, красный седан и синий фургон.
CREATE TABLE dbo.Cars
(
Model VARCHAR (15),
Price MONEY,
Color VARCHAR (10)
);
INSERT dbo.Cars
VALUES ('sedan', 10000, 'red'),
('convertible', 15000, 'blue'),
('coupe', 20000, 'red'),
('van', 8000, 'blue');
Чтобы получить такие результаты, можно написать следующий запрос.
SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;
GO
Вот результирующий набор.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
Непредвиденные результаты возвращаются, так как предложение TOP
логически выполняется перед предложением ORDER BY
, которое сортирует результаты оператора (UNION ALL
в данном случае). Таким образом, предыдущие запросы вернут произвольный красный и произвольный синий автомобили, а затем отсортируют результат такого объединения по цене. Следующий пример показывает, как правильно написать запрос, который позволит получить нужный результат.
SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC) AS b;
GO
Используя TOP
и ORDER BY
в операции вложенного выбора, убедитесь, что результаты предложения ORDER BY
применяются к предложению TOP
, а не к сортировке результатов операции UNION
.
Вот результирующий набор.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
Ограничения
При использовании TOP
с INSERT
, UPDATE
, MERGE
или DELETE
ссылки строки не упорядочивается в любом порядке. И вы не можете напрямую указать предложение ORDER BY
в этих инструкциях. Если необходимо использовать TOP
для вставки, удаления или изменения строк в понятном хронологическом порядке, используйте TOP
с предложением ORDER BY
, указанным в инструкции subselect. См. раздел примеров этой статьи.
Нельзя использовать TOP
в инструкциях UPDATE
или DELETE
для секционированных представлений.
Невозможно объединить TOP
с OFFSET
и FETCH
в одном выражении запроса (в той же области запроса). Дополнительные сведения см. в предложении SELECT — ORDER BY.
Примеры
Примеры кода Transact-SQL в этой статье используют пример базы данных AdventureWorks2022
или AdventureWorksDW2022
, которую можно скачать на домашней странице примеров Microsoft SQL Server и проектов сообщества.
Категория | Используемые элементы синтаксиса |
---|---|
Основной синтаксис | TOP * PERCENT |
Включить равные значения | WITH TIES |
Ограничение числа строк, обрабатываемых инструкциями DELETE, INSERT и UPDATE |
DELETE , INSERT , UPDATE |
Основной синтаксис
Примеры в этом разделе демонстрируют основные функциональные возможности предложения ORDER BY
с использованием минимального требуемого синтаксиса.
А. Использование TOP с константным значением
В следующих примерах константа указывает число сотрудников, возвращаемых в результирующем наборе запроса. В первом примере возвращаются первые 10 неопределенных строк, так как предложение ORDER BY
не используется. Во втором примере предложение ORDER BY
используется для возврата первых 10 недавно нанятых сотрудников.
USE AdventureWorks2022;
GO
-- Select the first 10 random employees.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee;
GO
-- Select the first 10 employees hired most recently.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
B. Использование TOP с переменной
В следующем примере переменная указывает число сотрудников, возвращаемых в результирующем наборе запроса.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
В. Указание процента
В следующем примере используется PERCENT
, чтобы указать количество сотрудников, возвращаемых в результирующем наборе запросов. В таблице HumanResources.Employee
содержится 290 сотрудников. 5 % от 290 является дробным числом, поэтому значение округляется вверх до целого числа.
USE AdventureWorks2022;
GO
SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
Включение значений галстуков
А. Использование WITH TIES для включения строк, соответствующих значениям в последней строке
Следующий пример извлекает первые 10
процентов работников с наибольшей зарплатой и возвращает их в порядке убывания зарплаты. Выбор WITH TIES
гарантирует, что в результирующий набор будут включены все работники с минимальной в этом списке зарплатой, даже если это приведет к превышению ограничения в 10
процентов работников.
USE AdventureWorks2022;
GO
SELECT TOP (10) PERCENT WITH TIES pp.FirstName,
pp.LastName,
e.JobTitle,
e.Gender,
r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;
GO
Ограничение строк, затронутых DELETE, INSERT или UPDATE
А. Использование TOP для ограничения количества удаленных строк
При использовании предложения TOP (<n>)
с DELETE
операция удаления выполняется при неопределенном выборе n числа строк. То есть оператор DELETE
выбирает любое (n) количество строк, которые соответствуют критериям, определенным в предложении WHERE
. Следующий пример удаляет из таблицы 20
PurchaseOrderDetail
строк с датой завершения до 1 июля 2002 г.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Если вы хотите использовать TOP
для удаления строк в понятном хронологическом порядке, используйте TOP
с ORDER BY
в инструкции subselect. Следующий запрос удаляет из таблицы PurchaseOrderDetail
10 строк, имеющих самую раннюю дату. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки (PurchaseOrderID
) должен являться первичным ключом таблицы. Использование столбца nonkey в инструкции subselect может привести к удалению более 10 строк, если указанный столбец содержит повторяющиеся значения.
USE AdventureWorks2022;
GO
DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC
);
GO
B. Использование TOP для ограничения количества вставленных строк
В следующем примере создается таблица EmployeeSales
и вставляется имя и данные о продажах за текущий год для 5 первых сотрудников из таблицы HumanResources.Employee
. Оператор INSERT
выбирает все пять строк, возвращаемых оператором SELECT
, которые соответствуют критериям, определенным в предложении WHERE
. Предложение OUTPUT
отображает строки, вставляемые в таблицу EmployeeSales
. Предложение ORDER BY
в инструкции SELECT
не используется для определения пяти лучших сотрудников.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
(
EmployeeID NVARCHAR (11) NOT NULL,
LastName NVARCHAR (20) NOT NULL,
FirstName NVARCHAR (20) NOT NULL,
YearlySales MONEY NOT NULL
);
GO
INSERT TOP (5) INTO dbo.EmployeeSales
OUTPUT
inserted.EmployeeID,
inserted.FirstName,
inserted.LastName,
inserted.YearlySales
SELECT sp.BusinessEntityID,
c.LastName,
c.FirstName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
Если вы хотите использовать TOP
для вставки строк в понятном хронологическом порядке, используйте TOP
с ORDER BY
в инструкции subselect. В следующем примере показано, как это сделать. Предложение OUTPUT
отображает строки, вставляемые в таблицу EmployeeSales
. Первые пять сотрудников теперь вставляются на основе результатов предложения ORDER BY
вместо неопределенных строк.
INSERT INTO dbo.EmployeeSales
OUTPUT
inserted.EmployeeID,
inserted.FirstName,
inserted.LastName,
inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID,
c.LastName,
c.FirstName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
В. Использование TOP для ограничения количества обновленных строк
В следующем примере используется предложение TOP
для обновления строк в таблице. При использовании предложения TOP (<n>)
с UPDATE
операция обновления выполняется в неопределенном количестве строк. То есть оператор UPDATE
выбирает любое (n) количество строк, которые соответствуют критериям, определенным в предложении WHERE
. В следующем примере 10 случайно выбранных заказчиков переназначаются от одного менеджера по продажам к другому.
USE AdventureWorks2022;
UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
Если необходимо использовать TOP
для применения обновлений в понятной хронологии, необходимо использовать TOP
вместе с ORDER BY
в инструкции subselect. В следующем примере изменяется длительность отпуска для 10 сотрудников, имеющих наибольший стаж работы.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID
FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
В приведенном ниже примере возвращаются первые строки (31), соответствующие условию запроса. Предложение ORDER BY
гарантирует, что 31 возвращаемых строк являются первыми 31 строками на основе алфавитного порядка столбца LastName
.
Использование TOP
без указания связей.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Результат: возвращается 31 строка.
Использование TOP
, указание WITH TIES
.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Результат: возвращаются 33 строки, так как три сотрудника с именем Brown
галстук для 31-й строки.