# ClicKHouse基本語法
[TOC]
## 數據庫操作
show databases ;

create database if not exists datatest1;

use datatest1;
select currentDatabase() ;
-- 刪除庫
drop database datatest1;

## DDL語句
- 建表
> <p style="color:red">目前只有MergeTree、Merge和Distributed這三類表引擎支持ALTER語法</p>,所以在進行alter操作的時候注意表的引擎
**ClickHouse中建表的時候一定要求指定表的引擎**
Memory 引擎以未壓縮的形式將數據存儲在 RAM 中,重新啟動服務器時,表中的數據消失,表將變為空。一般用于測試。
```SQL
CREATE TABLE tb_test1 ( `id` Int8, `name` String ) ENGINE = Memory() ;
```

- 修改表結構
```
alter table tb_test1 add column age UInt8 ;
```
提示異常:

- 創建MergeTree引擎的表
> Clickhouse 中最強大的表引擎當屬`MergeTree`(合并樹)引擎及該系列(`*MergeTree`)中的其他引擎。
> MergeTree系列的引擎被設計用于插入極大量的數據到一張表當中。數據可以以數據片段的形式一個接著一個的快速寫入,數據片段在后臺按照一定的規則進行合并。相比在插入時不斷修改(重寫)已存儲的數據,這種策略會高效很多。
先追加再合并
MergeTree引擎一定要指定主鍵,用于合并排序,order by默認指定主鍵
```
CREATE TABLE tb_test2 ( `id` Int8, `name` String ) ENGINE = MergeTree() ORDER BY id ;
```

- 添加字段
```
alter table tb_test1 add column age UInt8 ;
```

```
alter table tb_test2 add column gender String comment '性別' after name ;
```

- 刪除字段
```
alter table tb_test2 drop column age ;
```
- 修改字段的數據類型
```
alter table tb_test2 modify column gender UInt8 default 0 ;
```
## DML語句
- 插入數據

<p style="color:red">只有mergeTree引擎才能對表數據進行修改</p>
- 刪除
```
alter table tb_test2 delete where id=2 ;
```

- 更新
alter table tb_test2 update age=18 where id=1

## 分區操作
<p style="color:red">目前只有MergeTree系列 的表引擎支持數據分區</p>
- 創建表
```
create table test_partition1( id String , ctime DateTime)engine=MergeTree() partition by toYYYYMM(ctime) order by (id) ;
```
- 插入數據
```
insert into test_partition1 values(1,now()) ,(2,'2021-06-11 10:12:11'),(3,'2021-07-20 10:12:11') ,(4,'2020-01-20 10:12:11') ;
```

- 分區命名規則
> 分區數據如果是數字就按數字命名分區文件夾,如果含字符串,則按Hash值來命名,可以根據內置system系統表查詢partition的值
按年月分區
插入數據后在/var/lib/clickhouse/data/的數據庫和表里可以看到多個文件夾

ClickHouse內置了許多system系統表,用于查詢自身的狀態信息。 其中parts系統表專門用于查詢數據表的分區信息

- 刪除分區
```
-- 刪除一個分區的數據
alter table test_partition1 drop partition '202001' ;
```

- 復制分區
clickHouse支持將A表的分區數據復制到B表,這項特性可以用于快速數據寫入、多表間數據同步和備份等場景,它的完整語法如下:
ALTER TABLE B REPLACE PARTITION partition_expr FROM A
不過需要注意的是,并不是任意數據表之間都能夠相互復制,它們還需要滿足兩個前提 條件:
·兩張表需要擁有相同的分區鍵
·它們的表結構完全相同。
```
create table test_partition2 as test_partition1 ;
show create table test_partition2 ; -- 查看表2的建表語句
```
│ CREATE TABLE default.test_partition2
(
`id` String,
`ctime` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(ctime)
ORDER BY id
SETTINGS index_granularity = 8192 │ -- 兩張表的結構完全一致

-- 復制一張表的分區到另一張表中
```
alter table test_partition2 replace partition '202106' from test_partition1
```

- 重置分區
如果數據表某一列的數據有誤,需要將其重置為初始值,如果設置了默認值那么就是默認值數據,如果沒有設置默認值,會給出系統默認的初始值,此時可以使用下面的語句實現:
```
alter table test_partition2 clear column name in partition '202107' ;
```

- 分區卸載和裝載
分區被卸載后,它的物理數據并沒有刪除,而是被轉移到了當前數據表目錄的detached子目錄下
```
-- 分區卸載
alter table test_partition2 detach partition '202106' ;
```


```
-- 裝載分區
alter table ttest_partition2 attach partition '202106';
```
## 視圖
> ClickHouse擁有普通和物化兩種視圖,其中物化視圖擁有獨立的存儲,而普通視圖只是一層簡單的查詢代理
- 普通視圖
普通視圖不會存儲任何數據,它只是一層單純的SELECT查詢映射,起著簡化查詢、明晰語義的作用,對查詢性能不會有任何增強。類似mysql。
- 物化視圖
物化視圖支持表引擎,數據保存形式由它的表引擎決定,創建物化視圖的完整語法如下所示
```
create materialized view mv_log engine=Log populate as select * from log ;
```
1)加上populate修飾符會在創建視圖的過程中,會連帶將源表中已存在的數據一并導入。
2)不使用POPULATE修飾符,那么物化視圖在創建之后是沒有數據的。
3)物化視圖只會同步在此之后被寫入源表的數據。目前并不支持同步刪除,如果在源表中刪除了數據,物化視圖的數據仍會保留。
- ClickHouse
- 第一節 ClickHouse入門
- 1.1ClickHouse概述
- 1.2ClickHouse單機安裝
- 1.3ClickHouse配置
- 1.4ClickHouse數據庫引擎
- 1.5ClickHouse集群部署
- 第二節 ClickHouse進階
- 2.1ClicKHouse數據類型
- 2.2ClicKHouse基本語法
- 2.3ClickHouse引擎
- 2.4ClickHouse函數
- 2.5ClickHouse分布式表
- 2.6ClickHouse權限和密碼加密
- 2.7ClickHouse數據導入和導出
- 第三節 ClicKHouse實戰篇
- 3.1ClickHouse的JDBC連接
- 3.2ClickHouse用戶行為分析
- 3.3ClickHouse實戰
- 第四節 ClicKHouse常見問題
- 4.1ClickHouse常見問題匯總
- 第五節 ClickHouse其他
- 5.1ClickHouse可視化工具
- 5.2ClickHouse學習教程