實時電商數倉(二十)之實時資料儲存與查詢(十) Clickhouse (五) SQL操作
1 SQL操作
基本上來說傳統關係型資料庫(以MySQL為例)的SQL語句,基本支援但是也有不一樣的地方。這裡不會從頭講解SQL語法只介紹Clickhouse與標準SQL(MySQL)不一致的地方。
1.1 Insert
基本與標準SQL(MySQL)基本一致
包括標準 insert into [table_name] values(…),(….)
以及 從表到表的插入
insert into [table_name] select a,b,c from [table_name_2]
1.2 Update 和 Delete
ClickHouse提供了Delete 和
雖然可以實現修改和刪除,但是和一般的OLTP資料庫不一樣,Mutation語句是一種很“重”的操作,而且不支援事務。
“重”的原因主要是每次修改或者刪除都會導致放棄目標資料的原有分割槽,重建新分割槽。所以儘量做批量的變更,不要進行頻繁小資料的操作。
刪除操作
alter table t_order_smt delete where sku_id ='sku_001';
修改操作
alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id =102;
由於操作比較“重”,所以Mutation語句分兩步執行,同步執行的部分其實只是進行新增資料新增分割槽和並把舊分割槽打上邏輯上的失效標記。知道觸發分割槽合併的時候,才會刪除舊資料釋放磁碟空間。
1.3查詢操作
clickhouse基本上與標準SQL差別不大。
支援子查詢
支援CTE(with 子句)
支援各種JOIN, 但是JOIN操作無法使用快取,所以即使是兩次相同的JOIN語句,Clickhouse也會視為兩條新SQL。
不支援視窗函式。
不支援自定義函式。
GROUP BY 操作增加了 with rollup\with cube\with total 用來計算小計和總計。
模擬資料
insert into t_order_mt values(101,'sku_001',1000.00,'2020-06-01 12:00:00') , (102,'sku_002',2000.00,'2020-06-01 12:00:00'), (103,'sku_004',2500.00,'2020-06-01 12:00:00'), (104,'sku_002',2000.00,'2020-06-01 12:00:00') (105,'sku_003',600.00,'2020-06-02 12:00:00'), (106,'sku_001',1000.00,'2020-06-04 12:00:00'), (107,'sku_002',2000.00,'2020-06-04 12:00:00'), (108,'sku_004',2500.00,'2020-06-04 12:00:00'), (109,'sku_002',2000.00,'2020-06-04 12:00:00'), (110,'sku_003',600.00,'2020-06-01 12:00:00')
select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with rollup;
with rollup : 從右至左去掉維度進行小計。
select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with cube;
with cube : 從右至左去掉維度進行小計,再從左至右去掉維度進行小計。
select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with totals;
with totals: 只計算合計。
1.4 alter操作
同mysql的修改欄位基本一致,
新增欄位
alter table tableName add column newcolname String after col1
修改欄位型別
alter table tableName modify column newcolname String ;
刪除欄位
alter table tableName drop column newcolname ;
1.5匯出資料
clickhouse-client --query "select toHour(create_time) hr ,count(*) from test1.order_wide where dt='2020-06-23' group by hr" --format CSVWithNames> ~/rs1.csv
支援格式的地址 https://clickhouse.tech/docs/v19.14/en/interfaces/formats/#csvwithnames