限制排序结果
TOP 子句是 SELECT 子句的 Microsoft 专属扩展。 TOP 可用于指定要返回的行数,可以是正整数,也可以是所有符合条件的行的百分比。 行数可以指定为常量或表达式。 TOP 经常与 ORDER BY 一起使用,但也可以与无序数据一起使用。
使用 TOP 子句
与 ORDER BY 一起使用的 TOP 子句的简化语法如下所示:
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 Red, 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 Red, 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 筛选的行,同时使用另一种排序顺序来确定输出顺序。