限制排序的結果
TOP 子句是 Microsoft 在 SELECT 子句上的專屬延伸。 TOP 可讓您以正整數或所有合格資料列的百分比,指定要傳回的資料列數目。 您可以用常數或運算式來指定資料列數目。 TOP 最常與 ORDER BY 一起使用,但也可用於未排序的資料。
使用 TOP 子句
TOP 子句與 ORDER BY 一起使用的簡化語法如下所示:
SELECT TOP (N) <column_list>
FROM <table_source>
WHERE <search_condition>
ORDER BY <order list> [ASC|DESC];
例如,若要從 Production.Product 資料表中只取出 10 個最貴的產品,請使用下列查詢:
SELECT TOP 10 Name, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC;
結果如下所示:
名稱
ListPrice
Road-150 Red, 62
3578.27
Road-150 Red, 44
3578.27
Road-150 Red, 48
3578.27
Road-150 Red, 52
3578.27
Road-150 紅,56
3578.27
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 Silver, 44
3399.99
Mountain-100 Silver, 48
3399.99
Mountain-100 Black, 38
3374.99
TOP 運算子依賴 ORDER BY 子句提供有意義的先後順序給選取的資料列。 TOP 可以不與 ORDER BY 一起使用,但在此情況下,無法預知將傳回哪些資料列。 在此範例中,如果沒有 ORDER BY 子句,則可能傳回任何 10 筆訂單。
使用 WITH TIES
除了指定要傳回的固定資料列數目之外,TOP 關鍵字也接受 WITH TIES 選項,以取出在所選取前 N 個資料列中可能找到值的任何資料列。
在上述範例中,查詢依價格的遞減順序傳回前 10 個產品。 不過,如果將 WITH TIES 選項加入 TOP 子句中,您會看到更多資料列符合條件納入前 10 個最貴的產品中:
SELECT TOP 10 WITH TIES Name, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC;
這個修改過的查詢傳回下列結果:
名稱
ListPrice
Road-150 Red, 62
3578.27
Road-150 Red, 44
3578.27
Road-150 Red, 48
3578.27
Road-150 Red, 52
3578.27
Road-150 紅,56
3578.27
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 Silver, 44
3399.99
Mountain-100 Silver, 48
3399.99
Mountain-100 Black, 38
3374.99
Mountain-100 Black, 42
3374.99
Mountain-100 Black, 44
3374.99
Mountain-100 Black, 48
3374.99
決定是否包含 WITH TIES,將取決於您是否知道來源資料、是否可能有唯一值,以及您所撰寫的查詢有何需求。
使用 PERCENT
若要傳回一定百分比的合格資料列,請使用 PERCENT 選項搭配 TOP,而不是指定固定數目。
SELECT TOP 10 PERCENT Name, ListPrice
FROM SalesLT.Product
ORDER BY ListPrice DESC;
PERCENT 也可以與 WITH TIES 選項一起使用。
注意
在決定資料列計數時,TOP(N) PERCENT 會無條件進位到最近整數。
許多 SQL Server 專業人員在設法只擷取一定範圍的資料列時,都使用 TOP 選項。 不過,使用 TOP 時須留意下列事實:
- TOP 專屬於 T-SQL。
- TOP 本身不支援跳過資料列。
- 因為 TOP 依賴 ORDER BY 子句,您不能使用一個排序次序來建立由 TOP 篩選的資料列,又使用另一個排序次序來決定輸出順序。