clickhouse基本語法小計


個人學習筆記,謝絕轉載!!!
原文:https://www.cnblogs.com/wshenjin/p/13068122.html


數據庫

建庫語法:

CREATE DATABASE [IF NOT EXISTS] db_name [ENGINE=engine];

Clickhouse的數據庫也支持設置引擎。數據庫目前一共支持5種引擎:

  • Ordinary: 默認引擎,在此數據庫里可以使用任意類型的表引擎。
  • Dictionary: 字典引擎,此類數據庫會自動為所有數據字典創建他們的數據表。
  • Memory: 內存引擎,此類數據庫里的表只會停留在內存中,不涉及磁盤操作,服務重啟數據會被清除。
  • Lazy:日志引擎,此類數據庫里的表只能使用Log系列的表引擎。
  • MySQL: MySQL引擎,此類數據庫會自動拉取MySQL中的表,並為他們創建MySQL表引擎的數據表。

在絕大多數情況下只需使用默認數據庫引擎即可:

localhost :) CREATE DATABASE IF NOT EXISTS testdb ENGINE=Ordinary;

建庫之后,clickhouse會在path路徑的data目錄下創建對應的數據庫目錄文件:

# ls -l data/
drwxr-x--- 2 clickhouse clickhouse   6 Feb 23 17:48 testdb
# ls -l metadata/
drwxr-x--- 2 clickhouse clickhouse  6 Feb 23 17:48 testdb
-rw-r----- 1 clickhouse clickhouse 41 Feb 23 17:48 testdb.sql

刪庫語法:

DROP DATABASE [IF EXISTS] db_name;

數據表

Clickhouse目前提供了三種最基本的建表方法。

1、常規定義方法:

CREATE TABLE [IF NOT EXISTS] [db_name].tb_name (
    name1 [type] [Default|Materialized|Alias expr],
    name2 [type] [Default|Materialized|Alias expr],
    ....
) ENGINE=engine

使用[db_name].參數可以為表指定數據庫,不指定默認使用default庫。

2、復制其他表結構:

CREATE TABLE [IF NOT EXISTS] [db_name2].tb_name2 AS [db_name1].tb_name1 ENGINE=engine

這種方式支持在不同數據庫之間復制表結構。

3、通過SELECT子句形式創建:

CREATE TABLE [IF NOT EXISTS] [db_name].tb_name ENGINE=engine AS SELECT...

這種方式不僅會根據SELECT子句創建相應的表結構,同時會順帶把SELECT子查詢的結果寫入。

刪表語法:

DROP TABL [IF EXISTS] [db_name].tb_name;

查看表結構:

SHOW CREATE TABLE tb_name;
DESCRIBE TABLE tb_name;
DESC tb_name;

默認值表達式

表字段支持三種默認值表達式定義方法:DEFAULT、MATERIALIZED、ALIAS。

無論哪種表達式,表字段一旦被定義了默認值,它便不再強制要求定義數據類型,因為clickhouse會根據默認值進行類型判斷。如果同時定義了表字段的類型和默認值表達式,則以明確定義的數據類型為主。

CREATE TABLE tt (
    id UInt16,
    c1 Default 123456,
    c2 String Default c1
) ENGINE = TinyLog ;

c1字段沒有定義數據類型,默認值是整形123456;c2字段定義數據類型,且默認值等於c1字段。

現在寫入數據,並查看:

localhost :)  INSERT INTO tt(id) VALUES(1);
localhost :)  INSERT INTO tt(id, c1) VALUES(2, 1111);
localhost :)  SELECT c1, c2, toTypeName(c1), toTypeName(c2) FROM tt;
┌─────c1─┬─c2─────┬─toTypeName(c1)─┬─toTypeName(c2)─┐
│ 123456 │ 123456 │ UInt32         │ String         │
│   1111 │ 1111   │ UInt32         │ String         │
└────────┴────────┴────────────────┴────────────────┘

tt表c1字段根據默認值被判斷為UInt32,而c2被定義了String類型,所以它最終的數據類型來自已定義的String。

三種默認值表達式的區別:

  • 數據寫入時,只有DEFAULT類型的字段可以出現在INSERT語句中,而MATERIALIZED和ALIAS都不能顯示賦值,只能依靠計算取值。
  • 數據查詢時,只有DEFAULT類型的字段可以通過SELECT * 返回,而MATERIALIZED和ALIAS類型的字段不會出現在SELECT * 的結果集中。
  • 數據存儲時,只有DEFAULT和MATERIALIZED類型的字段才支持持久化,而ALIAS類型的字段不支持,它的取值總是依靠計算產生。

臨時表

Clickhouse也有臨時表的概念,使用TEMPORARY關鍵字:

CREATE TEMPORARY TABLE [IF NOT EXISTS] tb_name (
    name1 [type] [Default|Materialized|Alias expr],
    name2 [type] [Default|Materialized|Alias expr],
    ....
)

臨時表特殊之處:

  • 生命周期和會話綁定,會話結束數據就會被撤銷,所以只支持Memory引擎。
  • 臨時表不屬於任何數據庫。
  • 臨時表優先級大於普通標,兩張表同名時,優先讀取臨時表。

通常不會刻意使用臨時表,它更多是被運用在clickhouse的內部,是數據在集群件傳播的載體。

表的基本操作

目前只有Merge、MergeTree和Distributed三類表引擎支持ALTER操作。

添加字段:

ALTER TABLE tb_name ADD COLUMN [IF NOT EXISTS] name [TYPE] [DEFAULT_EXPR] [AFTER name_after];

修改數據類型:

ALTER TABLE tb_name MODIFY COLUMN [IF EXISTS] name [TYPE] [DEFAULT_EXPR];

修改備注:

ALTER TABLE tb_name COMMENT COLUMN [IF EXISTS] name '****';

刪除字段:

ALTER TABLE tb_name DROP COLUMN [IF EXISTS] name;

移動表:

RENAME TABLE [db_name01.]tb_name01 TO [db_name02.]tb_name02, [db_name11.]tb_name11 TO [db_name12.]tb_name12, ...

RENAME TABLE 只能在同一個服務節點內。

清空表:

TRUNCATE TABLE [IF EXISTS] [db_name.]tb_name;

分區表

目前只有MergeTree家族的表引擎才支持表分區,使用PARTITION BY 指定分區鍵。例如下面pp1表使用了etime日期字段作為分區鍵,並將其格式化為年月的形式:

CREATE TABLE IF NOT EXISTS pp1 (
    id UInt8,
    data String,
    etime Date
) ENGINE=MergeTree() 
PARTITION BY toYYYYMM(etime) 
ORDER BY id;

寫入數據:

localhost :) INSERT INTO pp1(id, data, etime) VALUES(1,'A','2021-02-24'),(2,'B','2021-02-24'),(3,'C','2021-01-23'),(4,'D','2021-01-23'); 

localhost :) SELECT * FROM pp1;

┌─id─┬─data─┬──────etime─┐
│  3 │ C    │ 2021-01-23 │
│  4 │ D    │ 2021-01-23 │
└────┴──────┴────────────┘
┌─id─┬─data─┬──────etime─┐
│  1 │ A    │ 2021-02-24 │
│  2 │ B    │ 2021-02-24 │
└────┴──────┴────────────┘

通過system.parts系統表,查看表分區的狀態:

localhost :) select table, partition, path from system.parts where database='testdb' and table='pp1';

┌─table─┬─partition─┬─path─────────────────────────────────────────────────────────┐
│ pp1   │ 202101    │ /data/database/clickhouse/data/data/testdb/pp1/202101_5_5_0/ │
│ pp1   │ 202102    │ /data/database/clickhouse/data/data/testdb/pp1/202102_4_4_0/ │
└───────┴───────────┴──────────────────────────────────────────────────────────────┘

表分區的基本操作

刪除指定分區:

ALTER TABLE tb_name DROP PARTITION partition_expr;

復制分區數據:

ALTER TABLE tb_name1 REPLACE PARTITION partition_expr FROM tb_name2;

clickhouse支持將A表分區的數據復制到B表。可以相互復制的表需要滿足:

  • 兩張表需要有相同的分區鍵
  • 表結構完全相同

重置分區數據:

ALTER TABLE tb_name CLEAR COLUMN column_naem IN PARTITION partition_expr;

將數據表某一列重置為默認值。如果建表聲明了默認值表達式,則以表達式為准,否者以相應數據類型的默認值為准。

卸載分區:

ALTER TABLE tb_name DETACH PARTITION partition_expr;

裝載分區

ALTER TABLE tb_name ATTACH PARTITION partition_expr;

分區被卸載后,物理目錄並沒有被刪除而是轉移到當前數據目錄的detached子目錄下。而裝載分區則是反向操作。一旦分區被轉移到detached子目錄,就代表其脫離clickhouse的管理,clickhouse並不會主動清理這些文件,除非我們手動刪除或者重新裝載。

備份還原分區:

表分區數據的備份,可以通過FREEZE和FETCH實現。

數據寫入

INSERT語句支持三種語法范式。

VALUES格式:

INSERT INTO [db_name.]tb_name [(c1,c2,c3...)] VALUES(v1,v2,v3..), [(v1,v2,v3..)...]

指定格式:

INSERT INTO [db_name.]tb_name [(c1,c2,c3...)] FORMAT format_name data_set;

clickhouse 支持多種數據格式,常見的CSV格式寫入:

INSERT INTO tb1 FORMAT CSV \
'0001', 'AAA', '2020-01-01' \
'0002', 'BBB', '2020-02-02' 

SELECT子句形式:

INSERT INTO [db_name.]tb_name [(c1,c2,c3...)] SELECT...

通過SELECT子句將查詢結果寫入數據表,同樣也支持表達式或函數,例如:

INSERT INTO tb1 SELECT '0001', now();

數據的刪除與修改

Clickhouse提供了DELETE和UPDATE的能力,這類操作被稱為Mutation查詢,它可以看做是ALTER語句的變種。Mutation雖然能實現DELETE和UPDATE,但不能用通常意義上的DELTE和UPDATE來理解:Mutation是種很重的操作,更適用於批量數據的刪除修改;其次不支持事物,語句一旦被提交就立刻對現有數據產生影響,無法回滾;最后,Mutation是一個異步執行的過程,語句提交就立即返回。

DELETE語句:

ALTER TABLE [db_name.]tb_name DELETE WHERE fileter_expr;

UPDATE語句:

ALTER TABLE [db_name.]tb_name UPDATE column1 = expr1, column2 = expr2, ... WHERE fileter_expr;

UPDATE支持在一條語句中同時修改多個字段,但分區鍵和主鍵不能作為被修改的字段。

數據的導入導出

導出CSV:

[root@ ~]# clickhouse-client --password 123456 --database testdb  --query="select * from t1 format CSV;" > t.csv 
[root@ ~]# echo "select * from t1 format CSV" | clickhouse-client  --password 123456  --database testdb  > t.csv

從CSV導入:

[root@ ~]# cat t.csv | clickhouse-client --password 123456 --database testdb --query="insert into t1 FORMAT CSV" 
[root@ ~]# clickhouse-client --password 123456 --database testdb --query="insert into t1 FORMAT CSV"  < t.csv 

--format_csv_delimiter="|" ,指定導入導出的分隔符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM