类别:

查询语法

ORDER BY

SELECT 列表中指定结果表的行的排序方式。

语法

按特定列排序

SELECT ...
  FROM ...
  ORDER BY orderItem [ , orderItem , ... ]
  [ ... ]
Copy

其中:

orderItem ::= { <column_alias> | <position> | <expr> } [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Copy

按所有列排序

SELECT ...
  FROM ...
  ORDER BY ALL [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
  [ ... ]
Copy

参数

column_alias

出现在查询块的 SELECT 列表中的列别名。

position

表达式在 SELECT 列表中的位置。

expr

当前作用域中表的任意表达式。

{ ASC | DESC }

可以按升序(从低到高)或降序(从高到低)返回排序键的值。

默认值:ASC

NULLS { FIRST | LAST }

可以根据排序顺序(ASC 或 DESC),指定 NULL 值是在非 NULL 值之前还是之后返回。

默认值:取决于排序顺序(ASC 或 DESC);有关详细信息,请参阅下面的使用说明

ALL

按 SELECT 列表中指定的所有列对结果进行排序。结果按列的出现顺序排序。

例如,假设 SELECT 列表包含:

SELECT col_1, col_2, col_3
  FROM my_table
  ORDER BY ALL;
Copy

结果首先按 col_1 排序,然后依次按 col_2col_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() 分子句中。子查询或分子句中的 ORDER BY 仅在该子查询或分子句中应用。例如,以下查询中的 ORDER BY 只在子查询中而不在查询的最外层对结果进行排序:

    SELECT * 
      FROM (
        SELECT branch_name
          FROM branch_offices
          ORDER BY monthly_sales DESC
          LIMIT 3
      );
    
    Copy

    在该示例中,在子查询中指定 ORDER BY,因此子查询按月销售额的顺序返回名称。子查询中的 ORDER BY 不适用于外部查询。此查询返回月销售额排名前三的三个分支机构的名称,但不一定按月销售额排序。

    排序的开销可能很高。如果希望对外部查询的结果进行排序,请仅在查询的顶层使用 ORDER BY 子句,而且,除非必要,否则应避免在子查询中使用 ORDER BY 子句。

示例

以下示例演示如何使用 ORDER BY 对结果进行排序:

按字符串值排序

以下示例按字符串值对结果进行排序:

SELECT column1
  FROM VALUES
    ('a'), ('1'), ('B'), (null), ('2'), ('01'), ('05'),
    (' this'), ('this'), ('this and that'), ('&'), ('%')
  ORDER BY column1;
Copy
+---------------+
| COLUMN1       |
|---------------|
|  this         |
| %             |
| &             |
| 01            |
| 05            |
| 1             |
| 2             |
| B             |
| a             |
| this          |
| this and that |
| NULL          |
+---------------+

按数值排序

以下示例按数值对结果进行排序:

SELECT column1
  FROM VALUES
    (3), (4), (null), (1), (2), (6),
    (5), (0005), (.05), (.5), (.5000)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|    0.05 |
|    0.50 |
|    0.50 |
|    1.00 |
|    2.00 |
|    3.00 |
|    4.00 |
|    5.00 |
|    5.00 |
|    6.00 |
|    NULL |
+---------+

NULLS 排序:放在最前或最后

以下示例通过将 DEFAULT_NULL_ORDERING 参数设置为 LAST,将会话中的所有查询配置为将 NULLS 排在最后。

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|       1 |
|       2 |
|       3 |
|    NULL |
|    NULL |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       3 |
|       2 |
|       1 |
+---------+

以下示例通过在查询中指定 NULLS FIRST 来替换 DEFAULT_NULL_ORDERING 参数:

SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 NULLS FIRST;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+

以下示例将 DEFAULT_NULL_ORDERING 参数设置为 FIRST 以首先排序 NULLS:

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'FIRST';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| COLUMN1 |
|---------|
|       3 |
|       2 |
|       1 |
|    NULL |
|    NULL |
+---------+

以下示例通过在查询中指定 NULLS LAST 来替换 DEFAULT_NULL_ORDERING 参数:

SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 NULLS LAST;
Copy
+---------+
| COLUMN1 |
|---------|
|       1 |
|       2 |
|       3 |
|    NULL |
|    NULL |
+---------+

按 SELECT 列表中的所有列排序

要运行此部分中的示例,请创建下表:

CREATE OR REPLACE TABLE my_sort_example(a NUMBER, s VARCHAR, b BOOLEAN);

INSERT INTO my_sort_example VALUES
  (0, 'abc', TRUE),
  (0, 'abc', FALSE),
  (0, 'abc', NULL),
  (0, 'xyz', FALSE),
  (0, NULL, FALSE),
  (1, 'xyz', TRUE),
  (NULL, 'xyz', FALSE);
Copy

以下示例按表中的所有列对结果进行排序:

SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy

如下所示,结果首先按 a 列排序,然后依次按 sb 列(表中定义列的顺序)排序。

+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | abc  | NULL  |
| 0    | xyz  | False |
| 0    | NULL | False |
| 1    | xyz  | True  |
| NULL | xyz  | False |
+------+------+-------+

以下示例按升序对结果进行排序。

SELECT * FROM my_sort_example
  ORDER BY ALL ASC;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | abc  | NULL  |
| 0    | xyz  | False |
| 0    | NULL | False |
| 1    | xyz  | True  |
| NULL | xyz  | False |
+------+------+-------+

以下示例将 DEFAULT_NULL_ORDERING 参数设置为针对会话期间执行的所有查询将 NULL 值排在最后:

ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
Copy
SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| NULL | xyz  | False |
| 0    | NULL | False |
| 0    | abc  | NULL  |
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | xyz  | False |
| 1    | xyz  | True  |
+------+------+-------+

以下示例在查询中指定 NULLS FIRST 以替换该设置:

SELECT * FROM my_sort_example
  ORDER BY ALL NULLS FIRST;
Copy
+------+------+-------+
| A    | S    | B     |
|------+------+-------|
| NULL | xyz  | False |
| 0    | NULL | False |
| 0    | abc  | NULL  |
| 0    | abc  | False |
| 0    | abc  | True  |
| 0    | xyz  | False |
| 1    | xyz  | True  |
+------+------+-------+

以下示例按 bsa 顺序返回列。结果依次按 bsa 的顺序排序:

SELECT b, s, a FROM my_sort_example
  ORDER BY ALL NULLS LAST;
Copy
+-------+------+------+
| B     | S    | A    |
|-------+------+------|
| False | abc  | 0    |
| False | xyz  | 0    |
| False | xyz  | NULL |
| False | NULL | 0    |
| True  | abc  | 0    |
| True  | xyz  | 1    |
| NULL  | abc  | 0    |
+-------+------+------+
语言: 中文