order-by-clause
ORDER BY 子句指定结果表的行的顺序。
如果标识了单个排序规范 (具有关联方向的一个 排序键 ) ,那么将按该排序规范的值对行进行排序。 如果标识了多个排序规范,那么行按第一个标识的排序规范的值排序,然后按第二个标识的排序规范的值排序,依此类推。 每个 排序键 都不能具有数据类型 CLOB , DBCLOB , BLOB , XML ,任何这些类型上的单值类型或结构化类型 (SQLSTATE 42907)。
选择列表中的指定列可以由作为 简单整数 或 简单列名的 排序键 标识。 选择列表中的未命名列必须由 简单整数 标识,在某些情况下,必须由与选择列表中的表达式匹配的 排序键表达式 标识 (请参阅 排序键表达式的详细信息)。 如果未指定 AS 子句,并且该子句派生自常量,带有运算符的表达式或函数,那么列未命名。
根据比较规则执行排序。 如果 ORDER BY 子句包含十进制浮点列,并且这些列中存在相同数字的多个表示,那么未指定相同数字的多个表示的顺序。 空值高于所有其他值。 如果 ORDER BY 子句未对行进行完全排序,那么将以任意顺序显示具有所有已标识列的重复值的行。
- simple-column-name
- 通常标识结果表的列。 在这种情况下, simple-column-name 必须是选择列表中指定列的列名。如果查询是子查询,那么 simple-column-name 还可以标识 FROM 子句中标识的表,视图或嵌套表的列名。 这包括定义为隐式隐藏的列。 在以下情况下发生错误:
- 如果子查询在 select 子句中指定 DISTINCT (SQLSTATE 42822)
- 如果子查询生成分组结果,并且 simple-column-name 不是 分组表达式 (SQLSTATE 42803)
在
注释
部分的排序键中的列名
下描述了确定用于对结果进行排序的列。 - 简单整数
- 必须大于 0 且不大于结果表中的列数 (SQLSTATE 42805)。 整数 n 标识结果表的 n列。
- sort-key-expression
- 不只是列名或无符号整数常量的表达式。 对其应用排序的查询必须是 子查询 才能使用此格式的排序键。 sort-key-expression 不能包含相关标量全查询 (SQLSTATE 42703) 或具有外部操作的函数 (SQLSTATE 42845)。
排序键表达式 中的任何 列名 都必须符合
备注
部分中排序键中的列名
下描述的规则。有一些特殊情况进一步限制了可以指定的表达式。- 在子查询的 SELECT 子句中指定了 DISTINCT (SQLSTATE 42822)。
排序键表达式必须与子查询的选择列表中的表达式完全匹配 (scalar-fullselect 从不匹配)。
- 子查询已分组 (SQLSTATE 42803)。排序键表达式可以:
- 是子查询的选择列表中的表达式,
- 包含来自子查询的 GROUP BY 子句的 分组表达式
- 包括聚集函数,常量或主变量。
- 在子查询的 SELECT 子句中指定了 DISTINCT (SQLSTATE 42822)。
- ASC
- 按升序对行进行排序。 这是缺省值。
- DESC
- 以降序对行进行排序。
- NULLS FIRST
- 以升序或降序对行进行排序时,请在所有其他值之前列出空值。
- NULLS LAST
- 以升序或降序对行进行排序时,请在所有其他值之后列出空值。
- ORDER OF table-designator
- 指定 table-designator 中使用的相同顺序应用于子查询的结果表。 在指定此子句的子选择的 FROM 子句中必须有一个与 table-designator 匹配的表引用 (SQLSTATE 42703)。 如果嵌套子查询(或全查询)中的 ORDER BY 子句的列包含在外部子查询(或全查询)中,并指定这些列来代替 ORDER OF 子句,那么将应用相同的排序。请注意,在全查询中不允许此形式 (全查询的退行性形式除外)。 例如,以下内容无效:
以下示例 有效 :(SELECT C1 FROM T1 ORDER BY C1) UNION SELECT C1 FROM T2 ORDER BY ORDER OF T1SELECT C1 FROM (SELECT C1 FROM T1 UNION SELECT C1 FROM T2 ORDER BY C1 ) AS UTABLE ORDER BY ORDER OF UTABLE - 输入序列
- 指定对于 INSERT 语句,结果表将反映有序数据行的输入顺序。 仅当在 FROM 子句中使用 INSERT 语句时,才能指定 INPUT SEQUENCE 排序 (SQLSTATE 428G4)。 请参阅 table-reference (table-reference)。 如果指定了 INPUT SEQUENCE 并且未对输入数据进行排序,那么将忽略 INPUT SEQUENCE 子句。
注意
- 排序键中的列名:
- 列名是限定的。
查询必须是 子查询 (SQLSTATE 42877)。 列名必须明确标识子查询的 FROM 子句中某个表,视图或嵌套表的列 (SQLSTATE 42702)。 列的值用于计算排序规范的值。
- 列名未限定。
- 查询是子查询。
如果列名与结果表的多个列的名称相同,那么列名必须在排序子查询的 FROM 子句中明确标识某个表,视图或嵌套表的列 (SQLSTATE 42702)。 如果列名与一列相同,那么将使用该列来计算排序规范的值。 如果列名与结果表的列不同,那么它必须毫不含糊地标识 SELECT 语句中全查询的 FROM 子句中某个表,视图或嵌套表的列 (SQLSTATE 42702)。
- 查询不是子查询 (它包括集合操作,例如 union , except 或 intersect)。
列名不能与结果表的多个列的名称相同 (SQLSTATE 42702)。 列名必须与结果表的一列完全相同 (SQLSTATE 42707) ,此列用于计算排序规范的值。
- 查询是子查询。
- 列名是限定的。
- 限制: 使用 sort-key-expression 或 simple-column-name (其中列不在选择列表中) 可能会导致将列或表达式添加到 用于排序的临时表。 这可能导致达到表中列数的限制或表中行大小的限制。 如果需要临时表来执行排序操作,那么超出这些限制将导致错误。
