前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Clickhouse SQL语法

Clickhouse SQL语法

作者头像
awwewwbbb
发布2022-05-11 08:45:03
8630
发布2022-05-11 08:45:03
举报
文章被收录于专栏:chaplinthink的专栏

Insert

基本与标准 SQL(MySQL)基本一致 (1)标准

代码语言:javascript
复制
insert into [table_name] values(…),(….)

(2)从表到表的插入

代码语言:javascript
复制
insert into [table_name] select a,b,c from [table_name_2]

update和delete

ClickHouse 提供了 Delete 和 Update 的能力,这类操作被为 Mutation 查询,它可以看做 Alter 的一种。 虽然可以实现修改和删除,但是和一般的 OLTP 数据库不样,Mutation 语句是一种很“重”的操作,而且不支持事务。 “重”的原因主要是每次修改或者删除都会导致放弃目标数据原有分区,重建新分区。所以尽量做批量的变更,不要进行频繁小数据的操作

(1)删除操作

代码语言:javascript
复制
alter table t_order_smt delete where sku_id='sku_001';

(2)修改操作

代码语言:javascript
复制
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)插入数据

代码语言:javascript
复制
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]、[])

代码语言:javascript
复制
 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]、[])

代码语言:javascript
复制
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]、[])

代码语言:javascript
复制
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)新增字段

代码语言:javascript
复制
alter table tableName add column newcolname String after col1;
代码语言:javascript
复制
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. 修改字段
代码语言:javascript
复制
alter table tableName modify column newcolname String;
  1. 删除字段
代码语言:javascript
复制
alter table tableName drop column newcolname;

导出数据

代码语言:javascript
复制
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",""
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Insert
  • update和delete
  • 如何做到高性能update和delete
  • 查询
  • alter操作
  • 导出数据
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档