Order by子句的用法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ORDER BY 子句 (Transact-SQL)

★语法;

ORDER BY order_by_expression

[ COLLATE collation_name ]

[ ASC | DESC ]

[ ,...n ]

[ ]

::=

{

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

[

FETCH { FIRST | NEXT } {integer_constant |

fetch_row_count_expression } { ROW | ROWS } ONLY

]

}

★参数

order_by_expression

指定用于对查询结果集进行排序的列或表达式。可以将排序列指定为一个名称或列别名,也可以指定一个表示列在选择列表中所处位置的非负整数。

可以指定多个排序列。别名必须是唯一的。 ORDER BY 子句中的排序列的顺序定义了排序结果集的结构。也就是说,按第一列对结果集进行排序,然后按第二列对排序列表进行排序,依此类推。

ORDER BY 子句中引用的列名必须明确对应于选择列表中的列,或对应于 FROM 子句中指定的表中定义的列。

COLLATE collation_name

指定根据 collation_name 中指定的排序规则应执行的 ORDER BY 操作,而不是表或视图中所定义的列的排序规则。 collation_name 既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。有关详细信息,请参阅排序规则和Unicode 支持。 COLLATE 仅适用于 char、varchar、nchar 和 nvarchar 类型的列。

ASC | DESC

指定按升序或降序排列指定列中的值。 ASC 按从最低值到最高值的顺序进行排序。 DESC 按从最高值到最低值的顺序进行排序。 ASC 是默认排序顺序。 Null 值被视为最低的可能值。

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS } 指定开始从查询表达式返回行之前跳过的行数。该值可以是大于或等于零的整数常量或表达式。

offset_row_count_expression 可以是变量、参数或常数标量子查询。在使用子查询时,它无法引用在外部查询范围中定义的任何列。也就是说,它无法与外部查询相关联。

ROW 和 ROWS 是同义词,是为了与 ANSI 兼容而提供的。

在查询执行计划中,将在 TOP 查询运算符的 Offset 属性中显示偏移行数值。

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY

指定在处理 OFFSET 子句后返回的行数。该值可以是大于或等于 1 的整数常量或表达式。

fetch_row_count_expression 可以是变量、参数或常数标量子查询。在使用子查询时,它无法引用在外部查询范围中定义的任何列。也就是说,它无法与外部查询相关联。

FIRST 和 NEXT 是同义词,是为了与 ANSI 兼容而提供的。

ROW 和 ROWS 是同义词,是为了与 ANSI 兼容而提供的。

在查询执行计划中,将在 TOP 查询运算符的 Rows 或 Top 属性中显示偏移行数值。

★最佳实践

避免将 ORDER BY 子句中的整数指定为选择列表中的列位置表示形式例如,虽然 SELECT ProductID, Name FROM Production.Production ORDER BY 2 等语句是有效的,但与指定实际列名相比,其他人并不容易理解该语句。此外,对选择列表的更改(如更改列顺序或添加新列)需要修改 ORDER BY 子句,以避免出现意外的结果。

在 SELECT TOP (N) 语句中,始终使用 ORDER BY 子句。这是以可预知的方式指明哪些行受 TOP 影响的唯一方法。

★互操作性

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

在视图中使用 OFFSET 和 FETCH 并不会更改该视图的 Updateability 属性。★限制和局限

ORDER BY 子句中的列数没有限制;但是,在 ORDER BY 子句中指定的列的总大小不能超过 8,060 个字节。

无法在 ORDER BY 子句中使用 ntext、text、image、geography、geometry 和 xml 类型的列。

在 order_by_expression 出现在排名函数中时,无法指定整数或常量。有关详细信息,请参阅OVER 子句 (Transact-SQL)。

如果已在 FROM 子句中指定了表名的别名,则在 ORDER BY 子句中只能使用该别名来限定其列。

如果 SELECT 语句包含以下子句或运算符之一,则必须在选择列表中定义在ORDER BY 子句中指定的列名和别名:

∙UNION 运算符

∙EXCEPT 运算符

∙INTERSECT 运算符

∙SELECT DISTINCT

此外,当语句包含 UNION、EXCEPT 或 INTERSECT 运算符时,必须在第一个(左侧)查询的选择列表中指定列名或列别名。

在使用 UNION、EXCEPT 或 INTERSECT 运算符的查询中,只允许在语句末尾使用ORDER BY。只有在顶级查询而不是子查询中指定了 UNION、EXCEPT 和INTERSECT 时,此限制才适用。请参阅后面的“示例”一节。

除非还指定了 TOP 子句或 OFFSET 和 FETCH 子句,否则,视图、内联函数、派生表和子查询中的 ORDER BY 子句无效。在这些对象中使用 ORDER BY 时,该子句仅用于确定由 TOP 子句或 OFFSET 和 FETCH 子句返回的行。 ORDER BY 不保证在查询这些构造时得到有序结果,除非在查询本身中也指定了 ORDER BY。

索引视图或使用 CHECK OPTION 子句定义的视图中不支持 OFFSET 和 FETCH。

可以在允许 TOP 和 ORDER BY 的任何查询中使用 OFFSET 和 FETCH,但具有以下限制:

∙OVER 子句不支持 OFFSET 和 FETCH。

相关文档
最新文档