ClickHouse SQL 极简教程ClickHouse SQL之数据操作语言 DML

Posted 东海陈光剑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClickHouse SQL 极简教程ClickHouse SQL之数据操作语言 DML相关的知识,希望对你有一定的参考价值。


1.1. 数据操作

数据操作语言( DML,Data Manipulation Language ) 用于在数据库中添加(插入)、删除和修改(更新)数据。本节主要介绍ClickHouse中的数据插入、更新与删除操作。

1.1.1. 概述

数据操作语言DML,包括SQL数据更改语句,它修改存储的数据,但不修改数据模型,例如数据库模式或数据库表结构。DML语言常见的语法模式如下:

INSERT INTO ... VALUES ...

UPDATE ... SET ... WHERE ...

DELETE FROM ... WHERE ...

但是,在 ClickHouse 中,UPDATE 与DELETE 是设计在了 ALTER 指令体系中的。

1.1.2. 插入数据

一次一条数据插入

INSERT INTO clickhouse_tutorial.user_tag (user_id, gender, age, active_level, date)

VALUES (1, 'male', '18', '1', '2022-03-21');

INSERT INTO clickhouse_tutorial.user_tag (user_id, gender, age, active_level, date)

VALUES (2, 'female', '16', '2', '2022-03-21');

一次多条数据插入

INSERT INTO clickhouse_tutorial.user_tag (user_id, gender, age, active_level, date)

VALUES (3, 'female', '20', '3', '2022-03-21'),

       (4, 'female', '22', '4', '2022-03-21');

插入SELECT查询返回数据

INSERT INTO clickhouse_tutorial.user_tag

(UserID, WatchID, EventTime, Sex, Age, OS, RegionID, RequestNum, EventDate)

SELECT

    UserID,

    WatchID,

    EventTime,

    Sex,

    Age,

    OS,

    RegionID,

    RequestNum,

    EventDate

FROM tutorial.hits_v1

Query id: bfed9d12-b838-4125-9ee2-f61049bf0a56

↙ Progress: 30.91 million rows, 835.62 MB (6.66 million rows/s., 180.00 MB/s.) (0.0 CPU, 172.08 MB RAM)

████████████████████████████████████████████████ 99%

Ok.

0 rows in set. Elapsed: 7.552 sec. Processed 53.24 million rows, 1.37 GB (7.05 million rows/s., 180.96 MB/s.)

1.1.3. UPDATE更新数据 

语法

ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr

功能说明

更新表数据。ClickHouse 中ALTER TABLE 前缀种语法与大多数其他支持 SQL 的数据库系统不同。它旨在表明,与 OLTP 数据库中的类似查询不同,这是一项并非为频繁使用而设计的繁重操作。ALTER 查询是通过一种称为“突变”(Mutation)的机制实现的。

关于 ALTER TABLE ... UPDATE命令,详细说明如下:

1. WHERE子句中的过滤表达式filter_expr的值是UInt8类型,指定要更新的数据行。

2. 不支持更新用于计算主键或分区键的列。

3. 一个UPDATE操作可以包含多个用逗号分隔的命令,例如column1 = expr1,column2 = expr2。 UPDATE操作数据处理是同步还是异步,由系统配置项 mutation_sync 设置,可取值为:

0 - execute asynchronously。

1 - wait current server。

2 - wait all replicas if they exist。默认为0,异步后台进程执行,类似于 *MergeTree 表中的合并操作。

4. 对于 *MergeTree 表,Mutation操作通过重写整个数据Part来执行,Mutation不具备原子性。数据 Part一旦准备好就被Mutation Part替换,并且在Mutation执行期间,SELECT查询结果中可以看到,来自已经变异Part的数据,以及来自尚未变异Part的数据。

5. Mutation 按照创建顺序排序,并按该顺序应用于每个Mutation Part。

6. 在Mutation提交之前插入到表中的数据会被执行Mutation 操作,提交之后插入的数据不会执行Mutation 操作。

7. Mutation 操作不会阻塞数据插入。

8. 可以查看 system.mutations 表跟踪突变的进度。

9. 即使重新启动 ClickHouse 服务器,成功提交的变更仍将继续执行。一旦提交,就无法回滚突变。

10. 如果Mutation 由于某种原因被卡住,可以使用 KILL MUTATION 查询取消它。

11. 已经完成Mutation 的条目不会立即删除。保留条目的数量由 finished_mutations_to_keep 存储引擎参数确定。

12. 在系统配置表system.settings中,有关mutation的配置项如下:

SELECT *

FROM system.settings

WHERE name LIKE '%mutation%'

FORMAT Vertical

Query id: 24f6ca70-7117-41c5-bc3e-dd6615d5ee6d

Row 1:

──────

name:        background_merges_mutations_concurrency_ratio

value:       2

changed:     0

description: Ratio between a number of how many operations could be processed and a number threads to process them. Only has meaning at server startup.

min:         ᴺᵁᴸᴸ

max:         ᴺᵁᴸᴸ

readonly:    0

type:        Float

Row 2:

──────

name:        mutations_sync

value:       0

changed:     0

description: Wait for synchronous execution of ALTER TABLE UPDATE/DELETE queries (mutations). 0 - execute asynchronously. 1 - wait current server. 2 - wait all replicas if they exist.

min:         ᴺᵁᴸᴸ

max:         ᴺᵁᴸᴸ

readonly:    0

type:        UInt64

Row 3:

──────

name:        allow_nondeterministic_mutations

value:       0

changed:     0

description: Allow non-deterministic functions in ALTER UPDATE/ALTER DELETE statements

min:         ᴺᵁᴸᴸ

max:         ᴺᵁᴸᴸ

readonly:    0

type:        Bool

3 rows in set. Elapsed: 0.003 sec.

实例讲解

1、更新之前的数据

SELECT

    WatchID,

    JavaEnable,

    GoodEvent

FROM tutorial.hits_v1

WHERE WatchID = 7043438415214026105

Query id: e0dc9ae5-8f24-48e5-a56d-d107afa1dfe3

┌─────────────WatchID─┬─JavaEnable─┬─GoodEvent─┐

│ 7043438415214026105 │          1 │         1 │

└─────────────────────┴────────────┴───────────┘

2UPDATE 目标数据行

ALTER TABLE tutorial.hits_v1

    UPDATE JavaEnable = 0, GoodEvent = 0 WHERE WatchID = 7043438415214026105

以上是关于ClickHouse SQL 极简教程ClickHouse SQL之数据操作语言 DML的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse SQL 语法极简教程

ClickHouse SQL 极简教程ClickHouse SQL之数据定义语言 DDL

ClickHouse SQL 极简教程ClickHouse SQL 之数据控制语言 DCL

ClickHouse SQL 极简教程ClickHouse SQL 之数据查询语言 DQL

ClickHouse SQL 极简教程使用EXPLAIN 分析 SQL 执行计划

ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例