⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
友好的 SQL

DuckDB 提供了一些高级 SQL 特性和语法糖,使 SQL 查询更简洁。我们通俗地称之为“友好型 SQL”。

其中一些特性也受其他系统支持,而有些(目前)是 DuckDB 独有的。

子句

查询特性

字面量和标识符

数据类型

数据导入

函数和表达式

连接类型

尾随逗号

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

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

“组内 Top-N”查询

计算按某些条件排序的“组内 Top-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 │
└─────────┴───────┘

我们希望获取每个 grp 组中前 3 个 val 值的列表。传统的方法是在子查询中使用窗口函数

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]   │
└─────────────┘