JOIN | ClickHouse Documentation

JOIN 子句可以对左右两张表的数据进行连接,这是最常用的查询子句之一。它的语法包含连接精度和连接类型两部分。目前 ClickHouse 支持的 JOIN 子句形式如下:

JOIN 的连接精度分为 ALL、ANY 和 ASOF 三种,而连接类型也可分为外连接、内连接和交叉连接三种。除此之外,JOIN 查询还可以根据其执行策略被划分为本地查询和远程查询。

接下来,会基于下面三张测试表介绍 JOIN 用法:

-- join_tb1
┌─id───┬─name──────────┬─────────time────────┐
│  1   │ ClickHouse    │ 2019-05-01 12:00:00 │
│  2   │ Spark         │ 2019-05-01 12:30:00 │
│  3   │ ElasticSearch │ 2019-05-01 13:00:00 │
│  4   │ HBase         │ 2019-05-01 13:30:00 │
│ NULL │ ClickHouse    │ 2019-05-01 12:00:00 │
│ NULL │ Spark         │ 2019-05-01 12:30:00 │
└──────┴───────────────┴─────────────────────┘

-- join_tb2
┌─id──┬─rate──┬─────────time────────┐
│  1  │  100  │ 2019-05-01 11:55:00 │
│  2  │   90  │ 2019-05-01 12:01:00 │
│  3  │   80  │ 2019-05-01 13:10:00 │
│  5  │   70  │ 2019-05-01 14:00:00 │
│  6  │   60  │ 2019-05-01 13:50:00 │
└─────┴───────┴─────────────────────┘

-- join_tb3
┌─id──┬─star──┐
│  1  │ 1000  │
│  2  │  900  │
└─────┴───────┘

连接精度


连接精度决定了 JOIN 查询在连接数据时所使用的策略,则默认是 ALL。可以通过 join_default_strictness 配置参数修改默认的连接精度类型。

对数据是否连接匹配的判断是通过 JOIN KEY 进行的,目前只支持等式(EQUAL JOIN)。

交叉连接(CROSS JOIN)不需要使用 JOIN KEY,因为它会产生笛卡儿积。

ALL

如果左表内的一行数据,在右表中有多行数据与之连接匹配,则返回右表中全部连接的数据。而判断连接匹配的依据是左表与右表内的数据,基于连接键(JOIN KEY)的取值完全相等(equal),等同于 left.key = right.key。

SELECT a.id,a.name,b.rate 
FROM join_tb1 AS a 
ALL INNER JOIN join_tb2 AS b ON a.id = b.id

-- 结果集返回了右表中所有与左表id相匹配的数据
┌─id──┬─name──────────┬─rate────┐
│  1  │ ClickHouse    │  100    │
│  1  │ ClickHouse    │  105    │
│  2  │ Spark         │   90    │
│  3  │ ElasticSearch │   80    │
└─────┴───────────────┴─────────┘

ANY