当前位置: 首页 > news >正文

Clickhouse学习笔记(4)—— Clickhouse SQL

insert

insert操作和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 的一种;

具体语法:

Delete:ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr

Update:ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr

相关文档:

ALTER TABLE … DELETE Statement | ClickHouse Docs

ALTER TABLE … UPDATE Statements | ClickHouse Docs

从官方文档可以看出:

虽然可以实现修改和删除,但是和一般的 OLTP 数据库不一样,Mutation 语句是一种很“重”的操作,而且不支持事务,不建议经常使用

为什么说Mutation 语句是一种很“重”的操作?

t_order_smt表为例:

其中的数据如下:

data中的数据可以看出数据经过了一次合并:

在该表中进行删除操作:
alter table t_order_smt delete where sku_id ='sku_001';

虽然执行速度很快,但是可以看到多出来了两个数据文件:

这是因为Mutation 语句分两步执行,同步执行的部分其实只是进行新增数据、新增分区和并把旧分区打上逻辑上的失效标记;直到触发分区合并的时候,才会删除旧数据释放磁盘空间

因此每一次delete、update都意味着对于之前数据的复制,所以说是一种heavy operation

同时可以注意到,每进行一次mutation操作,都会产生一个mutation_num.txt文件,其中有对于此次mutation操作的详细记录:

而num的数值和数据文件的后缀相对应;

因为delete和update起初都是很”重“的操作,因此官方也提供了相对轻量级的操作:

但仅限于delete操作,详见官网:The Lightweight DELETE Statement | ClickHouse Docs

这里的delete操作语法和MySQL等OLTP数据库相同:

DELETE FROM [db.]table [ON CLUSTER cluster] WHERE expr

尝试一下效果:

当前表中的数据如下:

执行删除语句:delete from t_order_smt where sku_id = "sku_004";

发现并不支持,这是因为轻量级删除时v22.8版本才开放支持的功能

https://www.alibabacloud.com/help/zh/clickhouse/latest/new-features-overview

select

SELECT Query | ClickHouse Docs

查询操作和标准SQL语句差别不大:

1.支持子查询

2.支持 CTE(Common Table Expression 通用表表达式)

CTE是一种临时表,使用“WITH”命令,可以执行递归查询:

语法如下:

WITHcte1 AS (SELECT a, b FROM table1),cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a= cte2.c;

3.支持各种 JOIN,但是 JOIN 操作无法使用缓存,所以即使是两次相同的 JOIN 语句,ClickHouse 也会视为两条新 SQL

4.窗口函数(v21.3之后开放实验性窗口函数;目前已全面支持窗口函数)

Window Functions | ClickHouse Docs

5.不支持自定义函数

6.GROUP BY 操作增加了 with rollup\with cube\with total 用来计算小计和总计

with rollup:从右至左去掉维度进行小计

with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计

with totals: 只计算合计

比如说group by a,b

with rollup:相当于group by a,bgroup by agroup by null

with cube:相当于group by a,bgroup by agroup by bgroup by null

with totals:相当于group by a,bgroup by null

group by 测试

插入数据:

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');

with rollup:

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

结果如下:

with cube:

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

with totals:

alter操作

新增字段 add column

alter table tableName add column newcolname String after col1;

可以指定新增字段的位置

修改字段 modify column

alter table tableName modify column newcolname String;

删除字段

alter table tableName drop column newcolname;

更多操作详见:Column Manipulations | ClickHouse Docs

数据导出

语法格式如下:

clickhouse-client --password=why666 --query "select * from t_order_mt where create_time='2020-06-01 12:00:00'" --format CSVWithNames> /home/why/data/ck1.csv

执行命令后可以看到相应的csv文件:

注意:因为clickhouse中的一般是宽表,导出数据的功能不常用

更多数据格式详见:Formats for Input and Output Data | ClickHouse Docs

http://www.lryc.cn/news/229667.html

相关文章:

  • Centos, RockyLinux 常用软件安装汇总
  • Lua更多语法与使用
  • 探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用
  • UnityAI——动物迁徙中的跟随实现实例
  • 堆的应用-----Top k 问题
  • 11月14日星期二今日早报简报微语报早读
  • Spark读取excel文件
  • LLM大语言模型(典型ChatGPT)入门指南
  • Spring IOC - Bean的生命周期之实例化
  • 前端 BUG 总结
  • 【蓝桥杯软件赛 零基础备赛20周】第3周——填空题
  • Pytorch自动混合精度的计算:torch.cuda.amp.autocast
  • 一文看懂香港优才计划和高才通计划的区别和优势?如何选?
  • DTC Network旗下代币DSTC大蒜头即将上线,市场热度飙升
  • 高通SDX12:ASoC 音频框架浅析
  • 国际化:i18n
  • 【机器学习5】无监督学习聚类
  • 风景照片不够清晰锐利,四招帮你轻松解决
  • List中的迭代器实现【C++】
  • VB.NET三层之用户查询窗体
  • Django之路由层
  • 【06】VirtualService高级流量功能
  • 322. 零钱兑换
  • 【大模型-第一篇】在阿里云上部署ChatGLM3
  • 2023-11-14 mysql-主从复制-相关文档
  • ios 对话框 弹框,输入对话框 普通对话框
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • 基于IGT-DSER智能网关实现GE的PAC/PLC与罗克韦尔(AB)的PLC之间通讯
  • 创建符合 Web 可访问性标准的 HTML 布局
  • SQL学习(CTFhub)整数型注入,字符型注入,报错注入 -----手工注入+ sqlmap注入