轉載自:
測試版本:
通常,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