ClickHouse的SQL操作
2023-03-21 本文已影响0人
这货不是王马勺
基本上传统关系型数据库的SQL语句ClickHouse都支持,这里介绍与标准SQL不一致的地方。
建库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
CREATE DATABASE IF NOT EXISTS helloworld;
insert
基本与标准SQL一致
update和delete
update和delete这类操作被称为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语句分两步执行,同步执行的部分其实只是进行新增数据新增分区并把旧分区打上逻辑上的失效标记。知道触发分区合并的时候,才会删除旧数据释放磁盘空间,一般不会开放这样的功能给用户,由管理员完成。
实现高性能update或delete思路:
加两个字段:一个标志字段,用UInt8类型;一个版本字段,用UInt32类型;
更新则可以改成插入一条新的数据使版本号+1,
查询可以加上过滤条件,选择版本号最大的,可以用argMax函数,
删除可以用标志位处理。
查询操作
- 支持子查询
- 支持CTE(common table expression 公用表表达式 with子句)
- 支持各种join,但join无法使用缓存,即使是两次相同的join语句,ck也会视为两条新SQL
- 窗口函数(OVER ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]), 旧版本没有)
- 不支持自定义函数
- group by增加了with rollup\with cube\with total用来计算小计和总计
Alter操作
同MySQL基本一致
新增字段:
alter table tableName add column newcolname string after col1;
修改字段类型:
alter table tableName modify column newcolname String;
删除字段:
alter table tableName drop column colname;
导出数据
clickhouse-client --query"select * from t_order_mt where create_time = '2020-06-01 12:00:00'" --format CSVWithNames > /opt/module/data/rs1.csv
其他格式见官网interfaces