内容有缩减,原文请点击这里
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name
创建表
CREATE TABLE可以有几种形式。
创建一张表,最好指定引擎结构
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
创建一张像另一张表结构的表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name AS [db2.]name2 [ENGINE = engine]
创建一张自定义引擎,数据及结构来源于另一张表的表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name ENGINE = engine AS SELECT ...
默认值
列描述可以指定一个默认值的表达式,其中有以下几个方法:默认的expr、物化expr、别名expr。示例:URLDomain字符串默认域(URL)。如果没有定义默认值的表达式,那么默认值将被设置为0,用于数字、字符串的空字符串、数组的空数组,以及用于日期的00-00 00 00 00 00 0000-0000。不支持null。
临时表
在所有情况下,如果指定临时表,就会创建临时表。临时表有以下特点:
- 临时表在会话结束时消失,包括连接丢失。
- 一个临时表是用内存引擎创建的。其他表引擎不受支持。
- DB不能为临时表指定。它是在数据库之外创建的。
- 如果临时表与另一个表的名称相同,并且查询指定表名而不指定DB,则使用临时表。
- 对于分布式查询处理,查询中使用的临时表被传递给远程服务器。
在大多数情况下,临时表不是手动创建的,而是在使用外部数据进行查询时,或者在分布式(全局)中使用。
创建视图
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
有两种类型的视图:正常的和物化的。
在创建物化视图时,必须指定引擎—用于存储数据的表引擎。
物化视图的工作原理如下:当将数据插入SELECT中指定的表时,插入数据的一部分被这个SELECT查询转换,结果被插入到视图中。
普通视图不存储任何数据,只是执行从另一个表读取的数据。换句话说,正常的视图只不过是一个保存的查询。从视图读取时,这个保存的查询被用作FROM子句中的子查询。
举例,假设你已经创建了一个视图
CREATE VIEW view AS SELECT ...
而且写了一个查询
SELECT a, b, c FROM view
这个查询等价于这个子查询
SELECT a, b, c FROM (SELECT ...)
物化视图是这样安排的:在将数据插入到SELECT中指定的表时,插入数据的一部分被这个SELECT查询转换,结果被插入到视图中。如果您指定填充,则在创建时将现有的表数据插入视图中,就像创建一个CREATE TABLE。作为选择……否则,查询只包含创建视图后插入到表中的数据。我们不建议使用填充,因为在视图创建期间插入到表中的数据不会被插入到其中。
ATTACH
这个查询与CREATE完全相同,但是不是“创建”这个词,它使用“附加”这个词。
该查询不会在磁盘上创建数据,但是假设数据已经在适当的位置,并且只向服务器添加关于表的信息。执行附加查询后,服务器将知道表的存在。如果表以前是分离的,也就是说它的结构是已知的,那么您可以使用速记而不用定义结构。
ATTACH TABLE [IF NOT EXISTS] [db.]name
在启动服务器时使用该查询。服务器将表元数据存储为带有附加查询的文件,它只是在启动时运行(除了在服务器上显式创建的系统表之外)
DETACH
从服务器删除关于“name”表的信息。服务器停止知道表的存在。
DETACH TABLE [IF EXISTS] [db.]name
这不会删除表的数据或元数据。在下一次服务器启动时,服务器将读取元数据并再次查找表。类似地,可以使用附加查询重新连接一个“分离”表(除了系统表之外,没有为它们存储的元数据)。
DROP
DROP数据库
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
DROP TABLE
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
RENAME
重命名一个或多个表。
RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster]
所有表都在全局锁定下重命名。重命名表是一项轻操作。如果您在之后指定了另一个数据库,那么该表将被移动到这个数据库。但是,带有数据库的目录必须位于相同的文件系统中(否则,将返回错误)
ALTER
ALTER查询只支持MergeTree表,以及mergeand分布式。该查询有几个变体。
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...
增加列(排在某个列之后)
ADD COLUMN name [type] [default_expr] [AFTER name_after]
删除列
DROP COLUMN name
改变列类型
MODIFY COLUMN name [type] [default_expr]
不支持在主键或采样键中删除列(在引擎表达式中是列)。更改主键中包含的列的类型只有在此更改不会导致数据被修改时才可能(例如,允许将值添加到枚举中,或者将DateTime的类型更改为UInt32)。
有几个处理阶段:
- 用修改过的数据准备临时的(新的)文件
- 重命名旧文件