⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
ORDER BY 子句

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';

排序规则

文本默认使用二进制比较排序规则进行排序,这意味着值是根据其 UTF-8 二进制值进行排序的。虽然这对于 ASCII 文本(例如英语数据)非常有效,但对于其他语言,排序顺序可能不正确。为此,DuckDB 提供了排序规则。有关排序规则的更多信息,请参阅排序规则页面

示例

所有示例都使用此示例表

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;

选择地址,按城市名称降序排序,空值(NULLs)在末尾

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 Duck Duck Goose Ln Duck Town 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln DuckTown 11111
123 Quack Blvd DuckTown 11111

从左到右(按地址、然后按城市、再按邮政编码)降序排序

SELECT *
FROM addresses
ORDER BY ALL DESC;
地址 城市 邮政编码
123 Quack Blvd DuckTown 11111
111 Duck Duck Goose Ln DuckTown 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln Duck Town 11111

语法