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,因为它会产生笛卡儿积。
如果左表内的一行数据,在右表中有多行数据与之连接匹配,则返回右表中全部连接的数据。而判断连接匹配的依据是左表与右表内的数据,基于连接键(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 │
└─────┴───────────────┴─────────┘