ORDER BY
是一个输出修饰符。在逻辑上,它几乎在查询的最后阶段应用(就在 LIMIT
或 OFFSET
之前,如果存在的话)。
ORDER BY
子句根据排序条件按升序或降序对行进行排序。
此外,每个排序子句都可以指定是否将 NULL
值移动到开头或结尾。
ORDER BY
子句可以包含一个或多个表达式,用逗号分隔。
如果没有包含表达式,将会抛出错误,因为在这种情况下应该移除 ORDER BY
子句。
表达式可以以任意标量表达式(可以是列名)、列位置号(索引从1开始)或关键字 ALL
开头。
每个表达式可以选择性地后跟一个排序修饰符(ASC
或 DESC
,默认为 ASC
),和/或一个 NULL
排序修饰符(NULLS FIRST
或 NULLS LAST
,默认为 NULLS LAST
)。
ORDER BY ALL
ALL
关键字表示输出应按从左到右的每一列进行排序。
可以使用 ORDER BY ALL ASC
或 ORDER BY ALL DESC
和/或 NULLS FIRST
或 NULLS LAST
来修改此排序的方向。
请注意,ALL
不能与 ORDER BY
子句中的其他表达式组合使用——它必须单独使用。
请参见下面的示例。
NULL
排序修饰符
默认情况下,DuckDB 按照 ASC
和 NULLS LAST
排序,即值按升序排序,NULL
值排在最后。
这与 PostgreSQL 的默认排序顺序相同。
可以通过以下配置选项更改默认排序顺序。
使用 default_null_order
选项将默认的 NULL
排序顺序更改为 NULLS_FIRST
、NULLS_LAST
、NULLS_FIRST_ON_ASC_LAST_ON_DESC
或 NULLS_LAST_ON_ASC_FIRST_ON_DESC
:
SET default_null_order = 'NULLS_FIRST';
使用default_order
来更改默认排序顺序的方向为DESC
或ASC
:
SET default_order = 'DESC';
Collations
默认情况下,文本使用二进制比较排序规则进行排序,这意味着值是根据它们的二进制UTF-8值进行排序的。 虽然这对于ASCII文本(例如,英语数据)效果很好,但对于其他语言,排序顺序可能不正确。 为此,DuckDB提供了排序规则。 有关排序规则的更多信息,请参见排序规则页面。
Examples
所有示例都使用此示例表:
CREATE OR REPLACE TABLE addresses AS
SELECT '123 Quack Blvd' AS address, 'DuckTown' AS city, '11111' AS zip
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'DuckTown', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111-0001';
选择地址,按城市名称排序,使用默认的NULL
顺序和默认顺序:
SELECT *
FROM addresses
ORDER BY city;
选择地址,按城市名称降序排列,空值排在最后:
SELECT *
FROM addresses
ORDER BY city DESC NULLS LAST;
按城市排序,然后按邮政编码排序,两者都使用默认排序:
SELECT *
FROM addresses
ORDER BY city, zip;
按城市排序,使用德语排序规则:
SELECT *
FROM addresses
ORDER BY city COLLATE DE;
ORDER BY ALL
示例
从左到右按升序排序(按地址,然后按城市,然后按邮政编码):
SELECT *
FROM addresses
ORDER BY ALL;
地址 | 城市 | 邮政编码 |
---|---|---|
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111 |
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111-0001 |
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111 |
123 嘎嘎大道 | 鸭子镇 | 11111 |
从左到右按降序排序(按地址,然后按城市,然后按邮编):
SELECT *
FROM addresses
ORDER BY ALL DESC;
地址 | 城市 | 邮政编码 |
---|---|---|
123 鸭子大道 | 鸭子镇 | 11111 |
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111 |
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111-0001 |
111 鸭子鸭子鹅巷 | 鸭子镇 | 11111 |