参考官网:https://clickhouse.tech/docs/zh/sql-reference/statements/create/,更多详细文档可以参考官网,强烈推荐。
1、Clickhouse创建数据库,CREATE DATABASE,该查询用于根据指定名称创建数据库。
1 CREATE DATABASE [IF NOT EXISTS] db_name
数据库其实只是用于存放表的一个目录。如果查询中存在IF NOT EXISTS,则当数据库已经存在时,该查询不会返回任何错误。
2、Clickhouse数据表的定义语法,是在标准SQL的基础之上建立的。Clickhouse目前提供了三种最基本的建表方法,但是注意的是在Clickhouse中建表一定要指定表的引擎,在指定数据表字段之后,最后一定要指定数据表的引擎。CREATE TABLE的三种方式,对于CREATE TABLE,存在以下几种方式。
2.1、第一种方式,直接指定字段名称、字段类型,是否有默认值,中文备注名称等信息。
1 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
2 (
3 name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
4 name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
5 ...
6 ) ENGINE = engine
使用案例,如下所示:
1 master :)
2 master :) CREATE TABLE tb_table1
3 :-] (
4 :-] `id` UInt8,
5 :-] `name` String
6 :-] )ENGINE = TinyLog;
7
8 CREATE TABLE tb_table1
9 (
10 `id` UInt8,
11 `name` String
12 )
13 ENGINE = TinyLog
14
15 Ok.
16
17 0 rows in set. Elapsed: 0.038 sec.
18
19 master :) insert into tb_table1 values(1, '张三三');
20
21 INSERT INTO tb_table1 VALUES
22
23 Ok.
24
25 1 rows in set. Elapsed: 0.036 sec.
26
27 master :) select * from tb_table1;
28
29 SELECT *
30 FROM tb_table1
31
32 ┌─id─┬─name───┐
33 │ 1 │ 张三三 │
34 └────┴────────┘
35
36 1 rows in set. Elapsed: 0.014 sec.
37
38 master :)
注意,如果创建数据表没有指定数据库,将在default默认的数据库下创建一张数据表。注意末尾的engine参数,它被用于指定数据表的引擎,表引擎决定了数据表的特性,也决定了数据将会被如何存储和加载。
2.2、第二种方式,这种方式其实就是复制已经存在的一张表结构,可用于数据的备份,可用于多个数据库之间复制表机构。
创建一个与db2.name2具有相同结构的表,同时你可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。
1 CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
使用案例,如下所示:
1 master :) create database gab_db2;
2
3 CREATE DATABASE gab_db2
4
5 Ok.
6
7 0 rows in set. Elapsed: 0.009 sec.
8
9 master :) use gab_db2;
10
11 USE gab_db2
12
13 Ok.
14
15 0 rows in set. Elapsed: 0.051 sec.
16
17 master :) show tables;
18
19 SHOW TABLES
20
21 Ok.
22
23 0 rows in set. Elapsed: 0.010 sec.
24
25 master :) show tables;
26
27 SHOW TABLES
28
29 Ok.
30
31 0 rows in set. Elapsed: 0.011 sec.
32
33 master :) create table if not exists gab_db2.tb_name as gab_db.tb_name;
34
35 CREATE TABLE IF NOT EXISTS gab_db2.tb_name AS gab_db.tb_name
36
37 Ok.
38
39 0 rows in set. Elapsed: 0.014 sec.
40
41 master :) show tables;
42
43 SHOW TABLES
44
45 ┌─name────┐
46 │ tb_name │
47 └─────────┘
48
49 1 rows in set. Elapsed: 0.010 sec.
50
51 master :)
2.3、第三种方式,通过select查询的方式来创建表,同时也会导入查询的结果数据。
1 CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
使用案例,如下所示:
1 master :) create table tb_name2 engine=TinyLog as select * from gab_db.tb_name;
2
3 CREATE TABLE tb_name2
4 ENGINE = TinyLog AS
5 SELECT *
6 FROM gab_db.tb_name
7
8 Ok.
9
10 0 rows in set. Elapsed: 0.021 sec.
11 master :) show tables;
12
13 SHOW TABLES
14
15 ┌─name─────┐
16 │ tb_name │
17 │ tb_name2 │
18 └──────────┘
19
20 2 rows in set. Elapsed: 0.010 sec.
21
22 master :) select * from tb_name2;
23
24 SELECT *
25 FROM tb_name2
26
27 ┌─id─┬─age─┬───birthday─┬──────────updateTime─┐
28 │ 1 │ 22 │ 1994-05-16 │ 2021-02-20 14:21:30 │
29 │ 2 │ 24 │ 1994-05-17 │ 2021-02-20 14:21:30 │
30 └────┴─────┴────────────┴─────────────────────┘
31
32 2 rows in set. Elapsed: 0.010 sec.
33
34 master :)
3、Clickhouse删除表的语法结构。也可以通过此语法删除普通视图和物化视图。
1 DROP TABLE [IF EXISTS] [db_name.]table_name;
使用案例,如下所示:
1 master :)
2 master :) show tables;
3
4 SHOW TABLES
5
6 ┌─name─────┐
7 │ tb_name │
8 │ tb_name2 │
9 └──────────┘
10
11 2 rows in set. Elapsed: 0.008 sec.
12
13 master :) drop table tb_name2;
14
15 DROP TABLE tb_name2
16
17 Ok.
18
19 0 rows in set. Elapsed: 0.005 sec.
20
21 master :) show tables;
22
23 SHOW TABLES
24
25 ┌─name────┐
26 │ tb_name │
27 └─────────┘
28
29 1 rows in set. Elapsed: 0.006 sec.
30
31 master :)
4、临时表,Clickhouse也有临时表的概念,创建临时表的方法是在普通表的基础上添加temporary关键字,相比普通表而言,临时表有如下两点特殊之处。
1)、它的生命周期是会话绑定的,所以它只支持Memory表引擎,如果会话结束,数据表就会被销毁。 2)、临时表不属于任何数据库,所以在它的建表语句中,既没有数据库参数也没有数据表引擎参数。
临时表的优先级大于系统中的表,一般用于集群之间的数据传播的载体。临时表不属于任何数据库。会话断开以后表会自动删除,不会持久化。如果本地表和临时表冲突,临时表优先。可以用于数据库之间的数据迁移。
5、ClickHouse支持临时表,其具有以下特征:
1)、当回话结束时,临时表将随会话一起消失,这包含链接中断。 2)、临时表仅能够使用Memory表引擎。 3)、无法为临时表指定数据库。它是在数据库之外创建的。 4)、如果临时表与另一个表名称相同,那么当在查询时没有显示的指定db的情况下,将优先使用临时表。 5)、对于分布式处理,查询中使用的临时表将被传递到远程服务器。
可以使用下面的语法创建一个临时表:
1 CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name [ON CLUSTER cluster]
2 (
3 name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
4 name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
5 ...
6 )
大多数情况下,临时表不是手动创建的,只有在分布式查询处理中使用(GLOBAL) IN时为外部数据创建。
1 master :)
2 master :) CREATE temporary TABLE tb_table1
3 :-] (
4 :-] `id` UInt8,
5 :-] `name` String
6 :-] );
7
8 CREATE TEMPORARY TABLE tb_table1
9 (
10 `id` UInt8,
11 `name` String
12 )
13
14 Ok.
15
16 0 rows in set. Elapsed: 0.003 sec.
17
18 master :) insert into tb_table1 values(1, '张三三');
19
20 INSERT INTO tb_table1 VALUES
21
22 Ok.
23
24 1 rows in set. Elapsed: 0.004 sec.
25
26 master :) select * from tb_table1;
27
28 SELECT *
29 FROM tb_table1
30
31 ┌─id─┬─name───┐
32 │ 1 │ 张三三 │
33 └────┴────────┘
34
35 1 rows in set. Elapsed: 0.007 sec.
36
37 master :)
临时表不需要指定数据表的引擎,我们可以理解成临时表会将当前数据库中已经存在的同名表覆盖隐藏,当出现操作的时候,如果有临时表,那么会操作临时表。
6、Clickhouse拥有普通视图和物化两种视图。其中物化视图拥有独立的存储,而普通视图只是一层简单的查询代理。
6.1、普通视图不会存储任何数据,它只是一层单纯的select查询映射,起着简化查询,明晰语义的作用,对查询性能不会有任何增强。
1 CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
创建一个视图。它存在两种可选择的类型:普通视图与物化视图。普通视图不存储任何数据,只是执行从另一个表中的读取。换句话说,普通视图只是保存了视图的查询,当从视图中查询时,此查询被作为子查询用于替换FROM子句。
使用案例,如下所示:
1 master :) show tables;
2
3 SHOW TABLES
4
5 ┌─name───────┐
6 │ tb_array │
7 │ tb_enum │
8 │ tb_name │
9 │ tb_tinyLog │
10 │ tb_tuple │
11 │ user_db │
12 └────────────┘
13
14 6 rows in set. Elapsed: 0.017 sec.
15
16 master :) select * from tb_name;
17
18 SELECT *
19 FROM tb_name
20
21 ┌─id─┬─age─┬───birthday─┬──────────updateTime─┐
22 │ 1 │ 22 │ 1994-05-16 │ 2021-02-20 14:21:30 │
23 │ 2 │ 24 │ 1994-05-17 │ 2021-02-20 14:21:30 │
24 └────┴─────┴────────────┴─────────────────────┘
25
26 2 rows in set. Elapsed: 0.006 sec.
27
28 master :) CREATE VIEW view_name AS SELECT * from tb_name;
29
30 CREATE VIEW view_name AS
31 SELECT *
32 FROM tb_name
33
34 Ok.
35
36 0 rows in set. Elapsed: 0.009 sec.
37
38 master :) select * from view_name;
39
40 SELECT *
41 FROM view_name
42
43 ┌─id─┬─age─┬───birthday─┬──────────updateTime─┐
44 │ 1 │ 22 │ 1994-05-16 │ 2021-02-20 14:21:30 │
45 │ 2 │ 24 │ 1994-05-17 │ 2021-02-20 14:21:30 │
46 └────┴─────┴────────────┴─────────────────────┘
47
48 2 rows in set. Elapsed: 0.011 sec.
49
50 master :)
6.2、物化视图存储的数据是由相应的SELECT查询转换得来的。物化视图是特殊的表,有数据表结构,有数据表引擎,可以将数据持久化。
在创建物化视图时,你还必须指定表的引擎,将会使用这个表引擎存储数据。目前物化视图的工作原理:当将数据写入到物化视图中SELECT子句所指定的表时,插入的数据会通过SELECT子句查询进行转换并将最终结果插入到视图中。
1 master :)
2 master :) show tables;
3
4 SHOW TABLES
5
6 ┌─name───────┐
7 │ tb_array │
8 │ tb_enum │
9 │ tb_name │
10 │ tb_tinyLog │
11 │ tb_tuple │
12 │ user_db │
13 │ view_name │
14 └────────────┘
15
16 7 rows in set. Elapsed: 0.007 sec.
17
18 master :) create materialized view m_name_view engine=Log populate as select * from tb_name;
19
20 CREATE MATERIALIZED VIEW m_name_view
21 ENGINE = Log POPULATE AS
22 SELECT *
23 FROM tb_name
24
25 Ok.
26
27 0 rows in set. Elapsed: 0.011 sec