⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
ORDER BY Clause

ORDER BY 是一个输出修饰符。在逻辑上,它几乎在查询的最后阶段应用(就在 LIMITOFFSET 之前,如果存在的话)。 ORDER BY 子句根据排序条件按升序或降序对行进行排序。 此外,每个排序子句都可以指定是否将 NULL 值移动到开头或结尾。

ORDER BY 子句可以包含一个或多个表达式,用逗号分隔。 如果没有包含表达式,将会抛出错误,因为在这种情况下应该移除 ORDER BY 子句。 表达式可以以任意标量表达式(可以是列名)、列位置号(索引从1开始)或关键字 ALL 开头。 每个表达式可以选择性地后跟一个排序修饰符(ASCDESC,默认为 ASC),和/或一个 NULL 排序修饰符(NULLS FIRSTNULLS LAST,默认为 NULLS LAST)。

ORDER BY ALL

ALL 关键字表示输出应按从左到右的每一列进行排序。 可以使用 ORDER BY ALL ASCORDER BY ALL DESC 和/或 NULLS FIRSTNULLS LAST 来修改此排序的方向。 请注意,ALL 不能与 ORDER BY 子句中的其他表达式组合使用——它必须单独使用。 请参见下面的示例。

NULL 排序修饰符

默认情况下,DuckDB 按照 ASCNULLS LAST 排序,即值按升序排序,NULL 值排在最后。 这与 PostgreSQL 的默认排序顺序相同。 可以通过以下配置选项更改默认排序顺序。

使用 default_null_order 选项将默认的 NULL 排序顺序更改为 NULLS_FIRSTNULLS_LASTNULLS_FIRST_ON_ASC_LAST_ON_DESCNULLS_LAST_ON_ASC_FIRST_ON_DESC

SET default_null_order = 'NULLS_FIRST';

使用default_order来更改默认排序顺序的方向为DESCASC

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

Syntax