⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 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';

排序规则

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

示例

所有示例均使用此示例表

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;

选择地址,按城市名称降序排序,null 值排在最后

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

语法

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南