⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
友好的 SQL

DuckDB 提供了一些高级 SQL 功能和语法糖,使 SQL 查询更加简洁。我们通俗地将其称为“友好 SQL”。

其中一些功能由 DuckDB 首先引入,而另一些则受到其他系统的启发。许多最初由 DuckDB 引入的功能(例如 GROUP BY ALL)后来已被其他系统采用。

子句

查询功能

字面量与标识符

数据类型

数据导入

函数与表达式

连接类型

尾随逗号

DuckDB 允许尾随逗号,无论是在列出实体(例如列名和表名)时,还是在构造 LIST时。例如,以下查询是有效的:

SELECT
    42 AS x,
    ['a', 'b', 'c',] AS y,
    'hello world' AS z,
;

“组内 Top-N”查询

计算按某种标准排序的“组内前 N 行”是 SQL 中的常见任务,但不幸的是,这通常需要涉及窗口函数和/或子查询的复杂查询。

为了辅助此操作,DuckDB 提供了聚合函数 max(arg, n), min(arg, n), arg_max(arg, val, n), arg_min(arg, val, n), max_by(arg, val, n)min_by(arg, val, n),以高效地返回基于特定列(升序或降序)的组内前 n 行。

例如,我们使用下表

SELECT * FROM t1;
┌─────────┬───────┐
│   grp   │  val  │
│ varchar │ int32 │
├─────────┼───────┤
│ a       │     2 │
│ a       │     1 │
│ b       │     5 │
│ b       │     4 │
│ a       │     3 │
│ b       │     6 │
└─────────┴───────┘

我们想要获取每个组 grpval 的前 3 大值。传统方法是在子查询中使用窗口函数

SELECT array_agg(rs.val), rs.grp
FROM
    (SELECT val, grp, row_number() OVER (PARTITION BY grp ORDER BY val DESC) AS rid
    FROM t1 ORDER BY val DESC) AS rs
WHERE rid < 4
GROUP BY rs.grp;
┌───────────────────┬─────────┐
│ array_agg(rs.val) │   grp   │
│      int32[]      │ varchar │
├───────────────────┼─────────┤
│ [3, 2, 1]         │ a       │
│ [6, 5, 4]         │ b       │
└───────────────────┴─────────┘

但在 DuckDB 中,我们可以更简洁(且更高效!)地完成此操作

SELECT max(val, 3) FROM t1 GROUP BY grp;
┌─────────────┐
│ max(val, 3) │
│   int32[]   │
├─────────────┤
│ [3, 2, 1]   │
│ [6, 5, 4]   │
└─────────────┘
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南