clickhouse的join实现


 
转载自:
 
测试版本:
        
 
        通常,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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM