1. 程式人生 > 實用技巧 >實時電商數倉(二十)之實時資料儲存與查詢(十) Clickhouse (五) SQL操作

實時電商數倉(二十)之實時資料儲存與查詢(十) Clickhouse (五) SQL操作

1 SQL操作

基本上來說傳統關係型資料庫(以MySQL為例)的SQL語句,基本支援但是也有不一樣的地方。這裡不會從頭講解SQL語法只介紹Clickhouse與標準SQLMySQL)不一致的地方。

1.1 Insert

基本與標準SQLMySQL)基本一致

包括標準 insert into [table_name] values(…),(….)

以及 從表到表的插入

insert into [table_name] select a,b,c from [table_name_2]

1.2 Update Delete

ClickHouse提供了Delete

Update的能力,這類操作被稱為Mutation查詢,它可以看做Alter 的一種。

雖然可以實現修改和刪除,但是和一般的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