order-by-clause

ORDER BY 子句指定结果表的行的顺序。

读取语法图跳过可视语法图ORDER BY,排序键ASCNULLS LASTNULLS FIRSTDESCNULLS FIRSTNULLS LASTORDER OF表标志符INPUT SEQUENCE
排序键
读取语法图跳过可视语法图简单列名简单整数排序键表达式

如果标识了单个排序规范 (具有关联方向的一个 排序键 ) ,那么将按该排序规范的值对行进行排序。 如果标识了多个排序规范,那么行按第一个标识的排序规范的值排序,然后按第二个标识的排序规范的值排序,依此类推。 每个 排序键 都不能具有数据类型 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 子句的 分组表达式
    • 包括聚集函数,常量或主变量。
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 T1
以下示例 有效 :
SELECT 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-expressionsimple-column-name (其中列不在选择列表中) 可能会导致将列或表达式添加到 用于排序的临时表。 这可能导致达到表中列数的限制或表中行大小的限制。 如果需要临时表来执行排序操作,那么超出这些限制将导致错误。