文章目录
- 简介
- 行列式存储
- 官网测试链接
- 数据类型
- 整型
- 浮点型
- 布尔型
- 字符串
- 枚举类型
- 数据组
- 元组
- 日期
- 时间戳
- 执行语句
- 数据库操作
- 库操作
- 创建数据库
- 表操作
- 新建表
- 新建MergeTree表
- 新建复制表
- 新增用例
- 列插入
- 查询用例
- 修改用例
- 删除用例
- 分区
- 查询分区信息
- 删除分区
- 复制分区数据
- 清除分区的数据
简介
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。ClickHouse不单单是一个数据库, 它是一个数据库管理系统。
行列式存储
这里有个概念:行式和列式存储。
行式存储在磁盘中:
张三 22 学生 李四 24 软件工程师 王五 26 教师
列式存储在磁盘中:
张三 李四 王五 22 24 26 学生 软件工程师 教师
这样的存储结构就决定了列式存储在查询上的高效性。
官网测试链接
在线demo编写
推荐使用数据库连接工具:DBeaver下载连接使用。
数据类型
整型
有符号整型(-2n-1~2n-1-1):
- Int8 - [-128 : 127]
- Int16 - [-32768 : 32767]
- Int32 - [-2147483648 : 2147483647]
- Int64 - [-9223372036854775808 : 9223372036854775807]
无符号整型范围(0~2n-1):
- UInt8 - [0 : 255]
- UInt16 - [0 : 65535]
- UInt32 - [0 : 4294967295]
- UInt64 - [0 : 18446744073709551615]
浮点型
- Float32 - float
- Float64 – double
布尔型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
字符串
- 变长字符串 String 字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
- 定长字符串 FixedString(N) 固定长度 N 的字符串(N 必须是严格的正自然数),类比varchar(255)
枚举类型
- Enum8 用 ‘String’= Int8 对描述。
- Enum16 用 ‘String’= Int16 对描述。值得注意的是:clickhouse里面的枚举类型只支持:String = Int,与之形成鲜明对应的是Java可以支持多种对应关系。
数据组
- Array(T)
由 T 类型元素组成的数组。T可以是任意类型,但数组的数据类型均为同一类型数据。
元组
- Tuple(T1, T2, …)
元组,其中每个元素都有单独的类型。
日期
- Date
用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值, 最小值输出为0000-00-00。
时间戳
- DateTime
用四个字节(无符号的)存储 Unix 时间戳,允许存储与日期类型相同的范围内的值。最小值为 0000-00-00 00:00:00,时间戳类型值精确到秒。
执行语句
ClickHouse严格区分大小写。
数据库操作
库操作
显示所有数据库
SHOW DATABASES;
显示库中的所有表
SHOW TABLES FROM datasets
显示表结构
DESCRIBE TABLE hits_100m_obfuscated
显示建表语句
SHOW CREATE TABLE hits_100m_obfuscated
--More detailed information about the table such as table engine, partition --schema etc can be obtained by
删除数据库
drop database datasets;
查看当前使用的数据库
select currentDatabase();
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
CREATE DATABASE IF NOT EXISTS cbry
表操作
新建表
需要指定表引擎ENGINE,表引擎决定了数据表的特性,也决定了数据将会被如何存储和加载。
值得注意的是,这里的TimyLog引擎:TinyLog 表用于小批量处理的中间数据。用于查询,不支持修改。此引擎适用于相对较小的表(建议最多1,000,000行)。如果您有许多小表,则使用此表引擎是适合的,因为它比Log引擎更简单(需要打开的文件更少)。
create table IF NOT EXISTS cbry.cbry_user(
uid Int32,
name String,
age UInt32
)ENGINE = TinyLog;
新建MergeTree表
需要主键,排序字段( primary key , order by) 两个一致。
create table IF NOT EXISTS cbry.cbry_user(
uid Int32,
name String,
age UInt32
)ENGINE = MergeTree()
PARTITION BY uid
ORDER BY uid;
PARTITION BY — 分区键 。
要按月分区,可以使用表达式 toYYYYMM(date_column) ,这里的 date_column 是一个 Date 类型的列。分区名的格式会是 "YYYYMM" 。
新建复制表
CREATE TABLE IF NOT EXISTS [db.]table_name AS [db2.]name2 [ENGINE = engine]
新增用例
INSERT into cbry.cbry_user values(1,'cbry',22)
列插入
可以在查询中指定要插入的列的列表,如:[(c1, c2, c3)]。您还可以使用列匹配器的表达式,例如*和/或修饰符,例如 APPLY, EXCEPT, REPLACE。
INSERT INTO cbry.cbry_user (* EXCEPT(name)) Values (3, 24);
查询用例
SELECT * FROM cbry_user WHERE name= 'cbry' LIMIT 2;
修改用例
系统不支持的其他用于修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。 但是,您可以使用 ALTER TABLE ... DROP PARTITION查询来删除一些旧的数据。
对建立的mergeTree引擎的表进行修改:
ALTER table cbry.cbry_user update name = 'cbry' WHERE age = 24
删除用例
drop tables cbry.cbry_user;
alter table cbry.cbry_user delete where name in ('cbry','zhangsan');
分区
查询分区信息
SELECT database, table, partition, partition_id, name, path FROM system.parts WHERE table = 'cbry_user'
删除分区
alter table cbry.cbry_user drop partition 3;
分区存储的对应数据也会被删除
复制分区数据
将一张表的分区数据复制到另外一张表里面。
alter table cbry.cbry_user replace partition 1 from cbry.cbry_user ;
清除分区的数据
清空分区的数据
alter table cbry.cbry_user CLEAR column age in partition 1;