⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
集合操作

集合运算允许按照集合运算语义组合查询。集合运算指 UNION [ALL]INTERSECT [ALL]EXCEPT [ALL] 子句。普通变体使用集合语义,即消除重复项,而带有 ALL 的变体则使用多重集(bag)语义。

传统集合运算按列位置统一查询,并要求参与组合的查询具有相同数量的输入列。如果列的类型不同,可能会添加类型转换。结果将使用第一个查询中的列名。

DuckDB 还支持 UNION [ALL] BY NAME,它通过列名而不是列位置来连接列。UNION BY NAME 不要求输入具有相同数量的列。缺失列的情况下将填充 NULL 值。

UNION

UNION 子句可用于组合来自多个查询的行。这些查询必须返回相同数量的列。在必要时,会对不同类型的列执行隐式类型转换以组合成其中一种返回类型。如果无法实现,UNION 子句将抛出错误。

普通 UNION(集合语义)

普通 UNION 子句遵循集合语义,因此它会执行去重,即结果中仅包含唯一行。

SELECT * FROM range(2) t1(x)
UNION
SELECT * FROM range(3) t2(x);
x
2
1
0

UNION ALL(多重集语义)

UNION ALL 返回两个查询的所有行,遵循多重集语义,即进行去重。

SELECT * FROM range(2) t1(x)
UNION ALL
SELECT * FROM range(3) t2(x);
x
0
1
0
1
2

UNION [ALL] BY NAME

UNION [ALL] BY NAME 子句可用于通过名称(而不是位置)组合不同表的行。UNION BY NAME 不要求两个查询具有相同数量的列。任何仅存在于其中一个查询中的列,在另一个查询中将填充 NULL 值。

以以下表格为例

CREATE TABLE capitals (city VARCHAR, country VARCHAR);
INSERT INTO capitals VALUES
    ('Amsterdam', 'NL'),
    ('Berlin', 'Germany');
CREATE TABLE weather (city VARCHAR, degrees INTEGER, date DATE);
INSERT INTO weather VALUES
    ('Amsterdam', 10, '2022-10-14'),
    ('Seattle', 8, '2022-10-12');
SELECT * FROM capitals
UNION BY NAME
SELECT * FROM weather;
城市 国家 学位 date
西雅图 NULL 8 2022-10-12
Amsterdam NL NULL NULL
柏林 德国 NULL NULL
Amsterdam NULL 10 2022-10-14

UNION BY NAME 遵循集合语义(因此它执行去重),而 UNION ALL BY NAME 遵循多重集语义。

INTERSECT

INTERSECT 子句可用于选择两个查询结果中都出现的行。

普通 INTERSECT(集合语义)

普通 INTERSECT 执行去重,因此仅返回唯一行。

SELECT * FROM range(2) t1(x)
INTERSECT
SELECT * FROM range(6) t2(x);
x
0
1

INTERSECT ALL(多重集语义)

INTERSECT ALL 遵循多重集语义,因此会返回重复项。

SELECT unnest([5, 5, 6, 6, 6, 6, 7, 8]) AS x
INTERSECT ALL
SELECT unnest([5, 6, 6, 7, 7, 9]);
x
5
6
6
7

EXCEPT

EXCEPT 子句可用于选择出现在左侧查询中的行。

普通 EXCEPT(集合语义)

普通 EXCEPT 遵循集合语义,因此执行去重,仅返回唯一行。

SELECT * FROM range(5) t1(x)
EXCEPT
SELECT * FROM range(2) t2(x);
x
2
3
4

EXCEPT ALL(多重集语义)

EXCEPT ALL 使用多重集语义

SELECT unnest([5, 5, 6, 6, 6, 6, 7, 8]) AS x
EXCEPT ALL
SELECT unnest([5, 6, 6, 7, 7, 9]);
x
5
8
6
6

语法

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