日期:2014-05-16  浏览次数:20470 次

用 ORDER BY 对行进行排序

ORDER BY 子句按一列或多列(最多 8,060 个字节)对查询结果进行排序。

从 Microsoft SQL Server 2005 开始,SQL Server 允许在 FROM 子句中指定对 SELECT 列表中未指定的表中的列进行排序。ORDER BY 子句中引用的列名必须明确地对应于 SELECT 列表中的列或 FROM 子句中的表中的列。如果列名已在 SELECT 列表中有了别名,则 ORDER BY 子句中只能使用别名。同样,如果表名已在 FROM 子句中有了别名,则 ORDER BY 子句中只能使用别名来限定它们的列。

排序可以是升序的 (ASC),也可以是降序的 (DESC)。如果未指定是升序还是降序,就假定为 ASC。

下面的查询返回按 ProductID 升序排序的结果:

USE AdventureWorks;
GO
SELECT ProductID, ProductLine, ProductModelID
FROM Production.Product
ORDER BY ProductID

?

如果 ORDER BY 子句中指定了多个列,则排序是嵌套的。下面的语句先按产品子类别降序排序 Production.Product 表中的行,然后在每个产品子类别中按 ListPrice 升序排序这些行。

?

USE AdventureWorks;
GO
SELECT ProductID, ProductSubcategoryID, ListPrice
FROM Production.Product
ORDER BY ProductSubcategoryID DESC, ListPrice

?

ORDER BY 子句的准确结果取决于被排序的列的排序规则。有关详细信息,请参阅使用排序规则。对于 charvarcharncharnvarchar 列,可以指定 ORDER BY 操作按照表或视图中定义的列的排序规则之外的排序规则执行。可以指定 Windows 排序规则名称或 SQL 排序规则名称。例如,使用 Latin1_General 排序规则定义 AdventureWorks 数据库中的 Person.Contact 表的 LastName 列,但在下面的脚本中,使用 Traditional_Spanish 排序规则按升序返回列。

USE AdventureWorks;
GO
SELECT LastName FROM Person.Contact
ORDER BY LastName
COLLATE Traditional_Spanish_ci_ai ASC
GO

?

无法对数据类型为 textntextimagexml 的列使用 ORDER BY。此外,在 ORDER BY 列表中也不允许使用子查询、聚合和常量表达式。但是,可以在聚合或表达式的选择列表中使用用户指定的名称。例如:

SELECT Color, AVG (ListPrice) AS 'average list price'
FROM Production.Product
GROUP BY Color
ORDER BY 'average list price'

?

ORDER BY 只保证查询的最外面的 SELECT 语句的排序结果。例如,考虑下面的视图定义:

CREATE VIEW TopView AS 
SELECT TOP 50 PERCENT * FROM Person.Contact       
ORDER BY LastName 

?

然后查询视图:

SELECT * FROM TopView   

?

尽管视图定义包含 ORDER BY 子句,但是该 ORDER BY 子句仅用于确定 TOP 子句返回的行数。查询视图自身时,SQL Server 不保证将对结果进行排序,除非明确指定,如下面的查询所示:

SELECT * FROM TopView       
ORDER BY LastName   

??