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