ORDER BY 子句 (Transact-SQL)

指定在 SELECT 语句返回的列中所使用的排序顺序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内联函数、派生表和子查询中无效。

注意注意

在视图、内联函数、派生表或子查询的定义中使用 ORDER BY 时,子句只用于确定 TOP 子句返回的行。ORDER BY 不保证在查询这些构造时得到有序结果,除非在查询本身中也指定了 ORDER BY。

主题链接图标Transact-SQL 语法约定

语法

[ ORDER BY 
    {
    order_by_expression 
  [ COLLATE collation_name ] 
  [ ASC | DESC ] 
    } [ ,...n ] 
] 

参数

  • order_by_expression
    指定要排序的列。可以将排序列指定为一个名称或列别名,也可以指定一个表示该名称或别名在选择列表中所处位置的非负整数。order_by_expression 出现在排名函数中时,不能指定整数。排序列可以包含表达式,但是当数据库处于 SQL Server (90) 兼容模式时,所包含的表达式无法解析为常量。列名和别名可由表名或视图名加以限定。在 SQL Server 中,限定的列名和别名将解析为 FROM 子句中列出的列。如果 order_by_expression 未限定,则该值在 SELECT 语句列出的所有列中必须是唯一的。

    可指定多个排序列。ORDER BY 子句中的排序列序列定义了排序结果集的结构。

    ORDER BY 子句可包含未显示在选择列表中的项。但是,如果已指定了 SELECT DISTINCT 或该语句包含 GROUP BY 子句,或者 SELECT 语句包含 UNION 运算符,则排序列必须显示在选择列表中。

    此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。

    注意注意

    ntext、text、image 或 xml列不能用于 ORDER BY 子句。

  • COLLATE {collation_name}
    指定根据 collation_name 中指定的排序规则,而不是表或视图中所定义的列的排序规则,应执行的 ORDER BY 操作。collation_name 可以是 Windows 排序规则名称或 SQL 排序规则名称。有关详细信息,请参阅安装程序中的排序规则设置使用 SQL Server 排序规则。COLLATE 仅适用于 char、varchar、nchar 和 nvarchar 数据类型的列。

  • ASC
    指定按升序,从最低值到最高值对指定列中的值进行排序。ASC 是默认排序。

  • DESC
    指定按降序,从最高值到最低值对指定列中的值进行排序。

注释

空值被视为最低的可能值。

对 ORDER BY 子句中的项目数没有限制。但是,排序操作所需的中间工作表的行大小限制为 8,060 个字节。这限制了在 ORDER BY 子句中指定的列的总大小。

在与 SELECT...INTO 语句一起使用以从另一来源插入行时,ORDER BY 子句不能保证按指定的顺序插入这些行。

示例

下面的示例说明结果集的排序。

按数值 ProductID 列排序。默认排序顺序为升序。

USE AdventureWorks
GO
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID ;

按数值 ProductID 列以降序排序。

SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

按 Name 列排序。请注意,字符按字母顺序排序,而不是数值顺序。也就是说,10 排列在 2 之前。

SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC ;

按两个列排序。此查询首先按 FirstName 列以升序排序,然后按 LastName 列以降序排序。

SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC ;