CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
指定方式:DEFAULT expr
,MATERIALIZED expr
,ALIAS expr
未定义,根据类型设置对应默认值,不支持null作为普通类型的默认值
定义了默认表达式,可不定义列的类型,如没有明确定义类的类型,则使用默认表达式的类型
EventDate DEFAULT toDate(EventTime),Date为类型
同时指定默认表达式与列的类型,将使用类型转换函数将默认表达式转换为指定的类型
MATERIALIZED exprr物化表达式,被改表达式指定的列不能包含在insert列表中(被计算出来的)对于insert而言,不需要考虑;在select中如包含*,该列不会被用来替换*:考虑数据转储,使用select * 的结果总能被insert回表
alias expr别名,这样的列不会存表中,值不能通过insert写入,同时使用select查询*,列不会被用来替换*号,可显示用于select中,在这种情况下,查询分析中别名被替换
使用alter查询,需要在旧数据查新列,查询时动态计算新列的值,如新列的默认表示中依赖其他列的值进行计算,将加载这些依赖列的数据
想表添加新列,且之后修改默认表达式,旧数据中的值将被改变:运行后台合并时,缺少的列的值被计算后写入到合并后的数据中
不能为nested类型的列设置默认值
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
)
对于create、drop、alter及rename,可运行在集群上,下在集群的all节点创建表
CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
为正确运行,每台主机须相同的cluster、须连接到zk服务器:最终在每台主机运行,即使有些主机当前不可用
还保证了所有的查询在单台主机中的执行顺序
replicated系列表还没有支持alter查询
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
创建视图:普通和物化
1、普通不存数据,从另个表读取:只保存了视图的查询,从视图中查询时,此查询被当做子查询替换from
1、create view view as select …… 2、select a,b from view == select a,b from (select ……)
2、物化视图存储的数据由相应select转换得来
创建时要指定表的引擎:使用表引擎存数据
原理:数据写入物理视图中select子句所指定的表时,插入的数会通select转换并将结果插入到视图中
如创建时指定了populate子句,在创建时将该表的数据插入到物理视图中,否物理视图只包含在创建后新写入的数据,不推荐使用populate:视图创建期间写入的数据不会写入其中
当select包含group by 、distinct、order by、limit时,这些仅会在插入数据时在每个单独的数据块上执行
不支持alter,不方便,使用to db.name,可用detach将视图剥离,再使用alter运行在目标表上,在使用attach将之前剥离的表重新加载进来
通过show tables查看视图,drop table删除视图
https://clickhouse.yandex/docs/zh/query_language/create/