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",""
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章