转载自:
测试版本:
通常,clikhouse推荐右边放小表,左边放大表,可以减少内存消耗。
基本JOIN操作
支持的JOIN方式:
按照代码Join.h的说明,ClickHouse支持14种Join,如下所示:
* JOIN-s could be of these types:
* - ALL × LEFT/INNER/RIGHT/FULL
* - ANY × LEFT/INNER/RIGHT
* - SEMI/ANTI x LEFT/RIGHT
* - ASOF x LEFT/INNER
* - CROSS
在tabix页面中创建测试数据库
create database lsl_test engine=Atmoic;
刷新页面,然后会在左边出现数据库
双击lsl_test,或者执行use lsl_test;
补充测试数据
创建测试表
create table left_t1(a UInt16,b UInt16,create_date date)Engine=MergeTree(create_date,a,8192);
create table right_t1(a UInt16,b UInt16,create_date date)Engine=MergeTree(create_date,a,8192);
插入数据
insert into left_t1 values(1,11,2020-3-20);
insert into left_t1 values(2,22,2020-3-20);
insert into left_t1 values(3,22,2020-3-20);
insert into right_t1 values(1,111,2020-3-20);
insert into right_t1 values(2,222,2020-3-20);
insert into right_t1 values(2,2222,2020-3-20);
特殊说明:
以上的时间写错了,2020-3-20应该写成'2020-3-20',因为这个错误,所以下面的时间都变成1975-06-21
ANY 与 ALL 修饰的JOIN
在使用ALL修饰符对JOIN进行修饰时,如果右表中存在多个与左表关联的数据,那么系统则将右表中所有可以与左表关联的数据全部返回在结果中。这与SQL标准的JOIN行为相同。
在使用ANY修饰符对JOIN进行修饰时,如果右表中存在多个与左表关联的数据,那么系统仅返回第一个与左表匹配的结果。如果左表与右表一一对应,不存在多余的行时,ANY与ALL的结果相同。
ANY JOIN

ALL JOIN

ALL INNER JOIN

ANY INNER JOIN

ALL LEFT JOIN
左连接,在内连接的基础上,对于那些在right_t1表中找不到匹配记录的left_t1表中的记录,用空值或0进行连接,

ANY LEFT JOIN

RIGHT JOIN
ALL RIGHT JOIN与和ANY RIGHT JOIN 与ALL LEFT JOIN与和ANY LEFT JOIN的操作类似,不做举例了
多表JOIN
注意,这里的数据与上面稍微有点不同。就是上面提到的日期
测试数据修正:
删除上面的表,重新创建,并插入数据。
drop table left_t1
drop table right_t1
创建测试表
create table left_t1(a UInt16,b UInt16,create_date date)Engine=MergeTree(create_date,a,8192);
create table right_t1(a UInt16,b UInt16,create_date date)Engine=MergeTree(create_date,a,8192);
插入数据
insert into left_t1 values(1,11,'2020-3-20');
insert into left_t1 values(2,22,'2020-3-20');
insert into left_t1 values(3,22,'2020-3-20');
insert into right_t1 values(1,111,'2020-3-20');
insert into right_t1 values(2,222,'2020-3-20');
insert into right_t1 values(2,2222,'2020-3-20');
基本JOIN语句
localhost :) select l.a,r.b from left_t1 as l join right_t1 as r on l.a=r.a
SELECT
l.a,
r.b
FROM left_t1 AS l
INNER JOIN right_t1 AS r ON l.a = r.a
┌─a─┬──r.b─┐
│ 1 │ 111 │
│ 2 │ 222 │
│ 2 │ 2222 │
└───┴──────┘
JOIN与GROUP BY