基本类型 | 复合类型 |
---|---|
数值 | 数组 |
字符串 | 元组(Tuple) |
时间 | 枚举 |
嵌套(Nested) |
特殊类型
Nullable:经过Nullable修饰的字段可以被写入null值(尽量便面使用Nullable类型,会降低查询性能)
Domain:域名类型(其实就是基于整型和字符串的进一步封装)
创建语句
CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]
数据库支持的引擎
Ordinary
:默认引擎,在绝大多数情况下我们都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎。
Dictionary
:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表,关于数据字典的详细介绍会在第5章展开。
Memory
:内存引擎,用于存放临时数据。此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除。
Lazy
:日志引擎,此类数据库下只能使用Log系列的表引擎,关于Log表引擎的详细介绍会在第8章展开。
MySQL
:MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为它们创建MySQL表引擎的数据表,关于MySQL表引擎的详细介绍会在第8章展开。
实际上一个数据库对应的是底层操作系统的一个文件目录。
clickhouse提供了三种创建表的方法
常规定义法
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
省略…
) ENGINE = engine
复制其他表结构
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name as [dbname.]table_name2 [ENGINE=engine]
通过select方式创建,这种方式会将表结构和数据都复制到新表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name ENGINE = engine AS SELECT …
临时表
创建普通表时增加TEMPORARY关键字,临时表不属于任何数据库,如果同时查询临时表和普通表,会优先读取临时表的数据
分区表
只有合并数(MergeTree)家族系列的表引擎才支持创建分区表
CREATE TABLE partition_v1 (
ID String,
URL String,
EventTime Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventTime)
ORDER BY ID
视图
视图又分为普通视图和物化视图两种
普通视图不会存储任何数据,只是单纯的将select查询映射,物化视图则相反,且支持表引擎
其他操作类型(增加列、删除列、增加备注等)都跟hive和MySQL大同小异,这里记录一个比较特殊的操作
移动数据表——RENAME关键字
不仅可以重命名表名,还可以移动表的位置(比如从A库移动到B库)如果移动前后两个库的库名相同,则相当于表重命名,类似于Linux mv命令的作用RENAME TABLE db1.table1 TO db2.table2
分区被卸载后,它的物理数据并没有删除,而是被转移到了当前数据表目录的detached子目录下。而装载分区则是反向操作,它能够将detached子目录下的某个分区重新装载回去。
一旦分区被移动到了detached子目录,就代表它已经脱离了ClickHouse的管理,ClickHouse并不会主动清理这些文件。
将一条普通的DDL语句转换成分布式执行十分简单,只需加上ON CLUSTER cluster_name声明即可。该声明可以对集群内的所有节点广播这条DDL语句
CREATE TABLE partition_v3 ON CLUSTER ch_cluster(
ID String,
URL String,
EventTime Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventTime)
ORDER BY I
行级别删除与更新时很“重”的操作(把原来的数据复制一份到新的数据目录,删除和更新后,再把原来的数据目录下线,使用新的数据目录),因此更适用于批量数据的修改和删除。其次不支持事务,也就是说,如果更新失败,则不会回滚。
# 删除数据
ALTER TABLE db_name.table_name DELETE WHERE filter_expr;
# 更新数据
ALTER TABLE db_name.table_name UPDATE url="xxx", os="bbb" WHERE id in(1,2,3);