1. 程式人生 > 其它 >Clickhouse SQL語法

Clickhouse SQL語法

Insert

基本與標準 SQL(MySQL)基本一致
(1)標準

insert into [table_name] values(…),(….)

(2)從表到表的插入

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

update和delete

ClickHouse 提供了 Delete 和 Update 的能力,這類操作被為 Mutation 查詢,它可以看做 Alter 的一種。
雖然可以實現修改和刪除,但是和一般的 OLTP 資料庫不樣,Mutation 語句是一種很“重”的操作,而且不支援事務。
“重”的原因主要是每次修改或者刪除都會導致放棄目標資料原有分割槽,重建新分割槽。所以儘量做批量的變更,不要進行頻繁小資料的操作

(1)刪除操作

alter table t_order_smt delete where sku_id='sku_001';

(2)修改操作

alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id =102;

由於操作比較“重”,所以 Mutation 語句分兩步執行,同步執行的部分其實只是進行新增資料新增分割槽和並把舊分割槽打上邏輯上的失效標記。直到觸發分割槽合併的時候,才會刪除舊資料釋放磁碟空間,一般不會開放這樣的功能給使用者,由管理員完成。

如何做到高效能update和delete

更新:新增version列,插入一條新資料,version+1,每次查詢查version最大的
刪除:新增sing列,0表示未刪除,1表示已刪除,version+1,每次查詢新增過濾條件,where sing = 0 and version最大
時間久了,資料會膨脹,過期資料可以定期刪除

查詢

ClickHouse 基本上與標準 SQL 差別不大
1) 支援子查詢
2) 支援 CTE(Common Table Expression 公用表表達式 with 子句)
3) 支援各種 JOIN,但是 JOIN 操作無法使用快取,所以即使是兩次相同的 JOIN 語句,
4) ClickHouse 也會視為兩條新 SQL
5) 視窗函式
6) 不支援自定義函式
7) GROUP BY 操作增加了 with rollup\with cube\with total 用來計算小計和總計。
rollup:上卷
cube:多維分析
total:總計

(1)插入資料

alter table t_order_mt delete where 1=1;

insert into t_order_mt values
(101,'sku_001',1000.00,'2020-06-01 12:00:00'),
(101,'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');

(2)with rollup:從右至左去掉維度進行小計([id,sku_id]、[id]、[])

 select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with rollup;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH ROLLUP

Query id: d210cbc1-3614-43f8-8be9-178dfec5601a

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘
┌──id─┬─sku_id─┬─sum(total_amount)─┐
│ 110 │        │               600 │
│ 106 │        │              1000 │
│ 105 │        │               600 │
│ 109 │        │              2000 │
│ 107 │        │              2000 │
│ 104 │        │              2000 │
│ 103 │        │              2500 │
│ 108 │        │              2500 │
│ 101 │        │              3000 │
└─────┴────────┴───────────────────┘
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘

20 rows in set. Elapsed: 0.090 sec.

3)with cube : 從右至左去掉維度進行小計,再從左至右去掉維度進行小計([id,sku_id]、[id]、[sku_id]、[])

43d457bfa2ca :) select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with cube;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH CUBE

Query id: 189f048c-12d9-456d-a2df-62794e91eeea

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘
┌──id─┬─sku_id─┬─sum(total_amount)─┐
│ 110 │        │               600 │
│ 106 │        │              1000 │
│ 105 │        │               600 │
│ 109 │        │              2000 │
│ 107 │        │              2000 │
│ 104 │        │              2000 │
│ 103 │        │              2500 │
│ 108 │        │              2500 │
│ 101 │        │              3000 │
└─────┴────────┴───────────────────┘
┌─id─┬─sku_id──┬─sum(total_amount)─┐
│  0 │ sku_003 │              1200 │
│  0 │ sku_004 │              5000 │
│  0 │ sku_001 │              2000 │
│  0 │ sku_002 │              8000 │
└────┴─────────┴───────────────────┘
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘

24 rows in set. Elapsed: 0.224 sec.

4)with totals: 只計算合計([id,sku_id]、[])

43d457bfa2ca :) select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with totals;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH TOTALS

Query id: f8b77dd4-cad5-4b7c-9777-651383617284

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘

Totals:
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘

10 rows in set. Elapsed: 0.062 sec.

alter操作

1)新增欄位

alter table tableName add column newcolname String after col1;
43d457bfa2ca :) alter table t_order_mt add column order_name String after create_time;

ALTER TABLE t_order_mt
    ADD COLUMN `order_name` String AFTER create_time

Query id: d1f81cf5-ed3e-412a-b9ad-d78012b7d446

Ok.

0 rows in set. Elapsed: 0.149 sec.

43d457bfa2ca :) desc t_order_mt;

DESCRIBE TABLE  t_order_mt

Query id: 5223eda7-795d-4c54-b0e6-eb9b7dfe550d

┌─name─────────┬─type───────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id           │ UInt32         │              │                    │         │                  │                │
│ sku_id       │ String         │              │                    │         │                  │                │
│ total_amount │ Decimal(16, 2) │              │                    │         │                  │                │
│ create_time  │ DateTime       │              │                    │         │                  │                │
│ order_name   │ String         │              │                    │         │                  │                │
└──────────────┴────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

5 rows in set. Elapsed: 0.001 sec.
  1. 修改欄位
alter table tableName modify column newcolname String;
  1. 刪除欄位
alter table tableName drop column newcolname;

匯出資料

root@43d457bfa2ca:/# touch data.csv
root@43d457bfa2ca:/# clickhouse-client --password --query "select * from t_order_mt where create_time='2020-06-01 12:00:00'" --format CSVWithNames >  data.csv

root@43d457bfa2ca:/# cat data.csv
"id","sku_id","total_amount","create_time","order_name"
101,"sku_001",1000,"2020-06-01 12:00:00",""
101,"sku_002",2000,"2020-06-01 12:00:00",""
103,"sku_004",2500,"2020-06-01 12:00:00",""
104,"sku_002",2000,"2020-06-01 12:00:00",""
110,"sku_003",600,"2020-06-01 12:00:00",""