⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Friendly SQL

DuckDB 提供了几种高级 SQL 功能和语法糖,以使 SQL 查询更加简洁。我们通常将这些称为“友好的 SQL”。

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

Clauses

查询功能

字面量和标识符

Data Types

Data Import

函数和表达式

连接类型

尾随逗号

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

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

"Top-N in Group" 查询

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

为了帮助实现这一点,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]   │
└─────────────┘