- 安装
- 文档
- 入门
- 连接
- 数据导入
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
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';
排序规则
文本默认使用二进制比较排序规则进行排序,这意味着值是根据其 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 |