ClickHouse SQL语法之DML 操作
DML:Data Manipulation Language,数据操纵语言。ClickHouse中DML语言包含插入、更新、删除数据操作,DML操作仅适用MergeTree引擎,不能针对主键、分区键、排序键进行DML操作,DML操作不支持事务,一旦执行成功会立刻生效。
一、Insert 插入
insert 向表中插入数据。
- insert 语法:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
或者
INSERT INTO [db.]table Select ...
- 示例:
#创建表 t_insert ,这里使用MergeTree引擎
node1 :) create table t_insert (id UInt8 ,name String) engine = MergeTree() order by id ;
#向表 t_insert 中插入数据
node1 :) insert into t_insert values (1,'张三',18),(2,'李四',19);
#向表 t_insert 中插入数据
node1 :) insert into t_insert select * from t_insert;
二、update 更新
由于ClickHouse针对的是OLAP业务分析,Update操作在ClickHouse中不会经常使用。这种更新效率低下。
- update 更新操作语法:
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
- 示例:
#创建表 t_update,使用MergeTree引擎
node1 :) create table t_update (id UInt8,name String,age UInt8) engine = MergeTree() order by id ;
#向表 t_update中插入如下数据
node1 :) insert into t_update values (1,'张三',18),(2,'李四',19)
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
│ 2 │ 李四 │ 19 │
└────┴──────┴─────┘
#更新姓名为 张三的年龄为 22
node1 :) alter table t_update update age = 22 where name = '张三';
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 22 │
│ 2 │ 李四 │ 19 │
└────┴──────┴─────┘
三、delete 删除
由于ClickHouse针对的是OLAP业务分析,Delete操作与Update操作一样在ClickHouse中不会经常使用。这种删除效率低下。
- delete 删除语法:
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr
- 示例:
#创建表 t_delete,使用MergeTree引擎
node1 :) create table t_delete (id UInt8,name String,age UInt8) engine = MergeTree() order by id ;
#向表 t_delete中插入以下数据
node1 :) insert into t_update values (1,'张三',18),(2,'李四',19)
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
│ 2 │ 李四 │ 19 │
└────┴──────┴─────┘
#删除 张三 此条数据
node1 :) alter table t_delete delete where name = '张三';
┌─id─┬─name─┬─age─┐
│ 2 │ 李四 │ 19 │
└────┴──────┴─────┘
四、向表中导入导出数据
ClickHouse中支持多种数据格式数据导入和导出,支持格式有ORC,Parquet,Avro,Protobuf,xml,json,csv等,具体操作参照官网:https://clickhouse.tech/docs/en/sql-reference/statements/alter/update/。下面以向表导入导出CSV格式数据为例操作:
- 示例:
#创建表 t_csv ,执行引擎为MergeTree
node1 :) create table t_csv (id UInt8,name String,age UInt8) engine = MergeTree order by id;
#在ClickHouse客户端准备数据文件 csvdata 写入以下数据
vim /root/csvdata
1,张三,18
2,李四,19
3,王五,20
4,马六,21
5,田七,22
#导入数据,在ClickHouse-client中执行导入数据命令
[root@node1 ~]# clickhouse-client --format_csv_delimiter="," --query="INSERT INTO newdb.t_csv FORMAT CSV" < /root/csvdata
注意:--format_csv_delimiter 指定分隔符
#进入ClickHouse客户端查看表 t_csv中的数据
node1 :) select * from t_csv;
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
│ 2 │ 李四 │ 19 │
│ 3 │ 王五 │ 20 │
│ 4 │ 马六 │ 21 │
│ 5 │ 田七 │ 22 │
└────┴──────┴─────┘
#导出数据,在ClickHouse-client中执行命令,将数据导入到result文件中
[root@node1 ~]# clickhouse-client --format_csv_delimiter="|" --query="select * from newdb.t_csv FORMAT CSV" > /root/result
#查看导出的结果数据
[root@node1 ~]# cat result
1|"张三"|18
2|"李四"|19
3|"王五"|20
4|"马六"|21
5|"田七"|22