- 类别:
ORDER BY¶
从 SELECT 列表中指定结果表的行的排序方式。
语法¶
按特定列排序
其中:
按所有列排序
参数¶
{ ASC | DESC }可以按升序(从低到高)或降序(从高到低)返回排序键的值。
默认值:ASC
NULLS { FIRST | LAST }可以根据排序顺序(ASC 或 DESC),指定 NULL 值是在非 NULL 值之前还是之后返回。
默认值:取决于排序顺序(ASC 或 DESC);有关详细信息,请参阅下面的使用说明
ALL按 SELECT 列表中指定的所有列对结果进行排序。结果按列的出现顺序排序。
例如,假设 SELECT 列表包含:
结果首先按
col_1排序,然后依次按col_2和col_3排序。备注
如果 SELECT 列表中的列使用聚合函数,则无法指定 ORDER BY ALL。
使用说明¶
所有数据都根据 ASCII 表中每个字符的数字字节值进行排序。支持 UTF-8 编码。
对于数值,小数点前的前导零和小数点后的尾随零 (
0) 对排序顺序没有影响。
未指定 NULLS FIRST 或 NULLS LAST 时,NULL 值的顺序取决于 DEFAULT_NULL_ORDERING 参数的设置和排序顺序:
当排序顺序为 ASC(默认)且 DEFAULT_NULL_ORDERING 参数设置为 :code:`LAST`(默认)时,最后返回 NULL 值。因此,除非另有说明,否则 NULL 值被视为高于任何非 NULL 值。
当排序顺序为 ASC 且 DEFAULT_NULL_ORDERING 参数设置为
FIRST时,首先返回 NULL 值。当排序顺序为 DESC 且 DEFAULT_NULL_ORDERING 参数设置为
FIRST时,最后返回 NULL 值。当排序顺序为 DESC 且 DEFAULT_NULL_ORDERING 参数设置为
LAST时,首先返回 NULL 值。
对于 半结构化 数据中不同数据类型的值,例如包含不同数据类型元素的数组,排序顺序不能保证一致。
Top-K 修剪可以提高同时包含 LIMIT 和 ORDER BY 子句的查询的性能。有关更多信息,请参阅 用于提高查询性能的 Top-K 修剪。
ORDER BY 子句可以在查询的不同层级中使用,例如在子查询中,或在窗口函数的 OVER() 子句内部。子查询或 OVER() 子句内部的 ORDER BY 子句仅在该上下文中生效。例如,以下查询中的 ORDER BY 子句只在子查询中而不在查询的最外层对结果进行排序:
在该示例中,在子查询中指定 ORDER BY 子句,因此子查询按月销售额的顺序返回名称。子查询中的 ORDER BY 子句不适用于外部查询。此查询返回月销售额排名前三的三个分支机构的名称,但不一定按月销售额排序。
排序的开销可能很高。如果希望对外部查询的结果进行排序,请仅在查询的顶层使用 ORDER BY 子句,而且,除非必要,否则应避免在子查询中使用 ORDER BY 子句。
同样,如果 ORDER BY 和 LIMIT。
示例¶
以下示例演示如何使用 ORDER BY 对结果进行排序:
按字符串值排序¶
以下示例按字符串值对结果进行排序:
按数值排序¶
以下示例按数值对结果进行排序:
NULLS 排序:放在最前或最后¶
以下示例通过将 DEFAULT_NULL_ORDERING 参数设置为 LAST,将会话中的所有查询配置为将 NULLS 排在最后。
以下示例通过在查询中指定 NULLS FIRST 来替换 DEFAULT_NULL_ORDERING 参数:
以下示例将 DEFAULT_NULL_ORDERING 参数设置为 FIRST 以首先排序 NULLS:
以下示例通过在查询中指定 NULLS LAST 来替换 DEFAULT_NULL_ORDERING 参数:
按 SELECT 列表中的所有列排序¶
要运行此部分中的示例,请创建下表:
以下示例按表中的所有列对结果进行排序:
如下所示,结果首先按 a 列排序,然后依次按 s、b 列(表中定义列的顺序)排序。
以下示例按升序对结果进行排序。
以下示例将 DEFAULT_NULL_ORDERING 参数设置为针对会话期间执行的所有查询将 NULL 值排在最后:
以下示例在查询中指定 NULLS FIRST 以替换该设置:
以下示例按 b、s 和 a 顺序返回列。结果依次按 b、s 和 a 的顺序排序: