**clickhouse 的sql语句要求很严格,区分大小写

建表数据类型:

Int8 .... Int256
UInt8 UInt256
Float32   Float64 
String 
Date 
DateTime

常用引擎

1.日志引擎

具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

1.Log引擎(数据分块)

create table  `tb_user`(
id String ,
name String ,
age UInt8 ,
birthday  Date
)  engine = Log;

insert into tb_user values('uid0002','wanggang',21,'1999-03-08');
insert into  tb_user  select * from tb_user ; -----此处会对表进行损坏

 

数据存储在本地的默认位置 
1) 数据是以列为文件存储
2) 插入数据的时候是想文件后面追加数据
3) xx.bin  列数据
4) size.json每个文件的大小
5) 不支持索引
6) 读写分离 
 

/var/lib/clickhouse/data/default/tb_user

-rw-r-----. 1 clickhouse clickhouse  54 Dec  3 21:58 age.bin
-rw-r-----. 1 clickhouse clickhouse  56 Dec  3 21:58 birthday.bin
-rw-r-----. 1 clickhouse clickhouse  68 Dec  3 21:58 id.bin
-rw-r-----. 1 clickhouse clickhouse  64 Dec  3 21:58 __marks.mrk  数据的块偏移量
-rw-r-----. 1 clickhouse clickhouse  69 Dec  3 21:58 name.bin  
-rw-r-----. 1 clickhouse clickhouse 151 Dec  3 21:58 sizes.json  -- 长度 

**合并块

optimize table tb_name;

2.TinyLog引擎(数据不分块)

每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。

该引擎没有并发控制

 - 只支持并发读

- 如果同时从表中读取和写入数据,则读取操作将抛出异常;

- 如果同时写入多个查询中的表,则数据将被破坏

2.MergeTree家族引擎

1.MergeTree引擎

基本格式

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2) 
ENGINE = MergeTree()   ----设置引擎为MergeTree
ORDER BY expr          ----必写项,不写报错,排序,没有写主键的话排序字段同时也代表主键字段
[PARTITION BY expr]    ----分区字段
[PRIMARY KEY expr]     ----主键字段
[SAMPLE BY expr]       ----取样字段
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]

建表语句

create table tb_merge_user(
id Int8,
name String
)
engine=MergeTree()
order by id;

insert into tb_merge_user values(1,'zs'),(2,'ls');
insert into tb_merge_user values(3,'ww');

┌─id─┬─name─┐
│  3 │ ww   │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
└────┴──────┘

合并后会多出一个合并文件

过段时间以后CK内部自动的会删除合并前的多余的文件夹

2.ReplacingMergeTree

这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。

建表语句:

create table tb_replace_user(
id UInt32,
name String,
version UInt32
)
engine=ReplacingMergeTree(version) ---删除主键相同的行,相同主键下按版本删除,留下高版本,删除低版本
order by id;

insert into tb_replace_user values(1,'ll',10),(2,'vv',20);
insert into tb_replace_user values(3,'nn',20);
insert into tb_replace_user values(3,'nn',40);

合并后:

┌─id─┬─name─┬─version─┐
│  1     │         ll  │              10 │
│  2     │ vv        │              20 │
│  3     │ nn        │             40 │
└────┴──────┴─────

3.CollapsingMergeTree

CollapsingMergeTree来消除ReplacingMergeTree的限制(只删除小版本字段,只保留最大版本数据)。该引擎要求在建表语句中指定一个标记列Sign,后台Compaction时会将主键相同、Sign相反的行进行折叠,也即删除。

建表语句:

create table tb_replac_tree(
id UInt8,
name String,
version UInt8
)
engine=ReplacingMergeTree(version)
order by id;

insert into tb_replac_tree values(1,'yyy',10),(2,'jjj',50);

insert into tb_replac_tree values(1,'y',20),(2,'j',20)(3,'w',20);

┌─id─┬─name─┬─version─┐
│  1 │ y    │      20 │
│  2 │ jjj  │      50 │
│  3 │ w    │      20 │
└────┴──────┴─────────┘

注意:

CollapsingMergeTree虽然解决了主键相同的数据即时删除的问题,但是状态持续变化且多线程并行写入情况下,状态行与取消行位置可能乱序,导致无法正常折叠。只有保证老的状态行在在取消行的上面, 新的状态行在取消行的下面! 但是多线程无法保证写的顺序!

4.VersionedCollapsingMergeTree

解决CollapsingMergeTree乱序写入情况下无法正常折叠问题,VersionedCollapsingMergeTree表引擎在建表语句中新增了一列Version,用于在乱序情况下记录状态行与取消行的对应关系。

建表语句:

create table tb_versioned_collapsing_mergetree(
id UInt8,
name String,
version UInt8,
flag Int8
)
engine=VersionedCollapsingMergeTree(flag,version)
order by id;

insert into tb_versioned_collapsing_mergetree values(
1,'a1',1,1)
(1,'a4',1,1)
(1,'a5',1,1
);
insert into tb_versioned_collapsing_mergetree values(
1,'a6',1,-1
);

只删除离标记最近的版本
┌─id─┬─name─┬─version─┬─flag─┐
│  1 │ a1   │       1 │    1 │
│  1 │ a4   │       1 │    1 │
└────┴──────┴─────────┴──────┘

集成引擎

1.本地引擎

默认的引擎, 默认操作本地或者是指定集群的数据

建表语句:

create table tb_user2(
id UInt32,
name String
)
engine=Log;

insert into tb_user2 values(3,'jj'),(4,'hh');
insert into tb_user2 values(10,'jj'),(20,'hh');

2.MySQL引擎

1.MySQL数据库引擎

不允许DDL操作

建表语句:

create database db_ch_doit19 engine=MySQL('linux01:3306','hive','root','root');

----参数一:MySQL地址 参数二:MySQL数据库名字  参数三:用户名  参数四:密码
----参数二 : 必须保证MySQL中有的数据库

把hive集成到ch中,hive有的表在ch中都可以看得到

2.MySQL表引擎

建表语句:

create table tb_user (
id Int32,
name String
)
engine=MySQL('linux01:3306','db_doit19','tb_user','root','root');

--参数一:MySQL地址 参数二:数据库名字 参数三:表名字 参数四:用户名 参数五:密码

--得到的表里的数据是MySQL表中的数据

3.HDFS表引擎

建表语句:

create table tb_user3(
id Int32,
name String
)
engine = HDFS('hdfs://linux01:8020/ch/data/user3.tsv','TSV');

参数一:hdfs地址(具体到文件的名字)  参数二:TSV(以制表符Tab间隔)或者CSV(以逗号为间隔)

4.三者联合查询

本地引擎、MySQL引擎及HDFS引擎可以两两联合join

建表语句:

select 
tb_user.id,
tb_user.name,
tb_user2.name
from
tb_user
join 
tb_user2
on 
tb_user.id=cast(tb_user2.id,'Int32');  

--格式转换函数:cast(x as T)将x的格式转化为T格式
eg: 1.   cast('15' as UInt8)
    2.   cast('15',UInt8)