數(shù)據(jù)類型
基礎(chǔ)類型
基礎(chǔ)類型只有三種 數(shù)值磷雇、字符串魄幕、時(shí)間
數(shù)值
1.1 數(shù)值類型 int (用int8 int16 int32 int64 代表tinyint smallint int bigint) 分別占用 1 2 4 8字節(jié),無符號(hào)整數(shù)加前綴U表示偶妖。
1.2 浮點(diǎn)數(shù) float (float32 float64 分別占用4 8字節(jié) 有效精度分別為7 16位)
1.3 定點(diǎn)數(shù) decimal (decimal32(S) decimal64(S) decimal128(S) 表示 decimal(1~9, S) decimal(10~18, S) decimal(19~38, S) )字符串
2.1 String
2.2 FixedString
2.3 UUID (8-4-4-4-12)時(shí)間
3.1 DateTime 精確到秒
3.2 DateTime64 精確到微秒
3.3 Date 精確到天
復(fù)合類型
復(fù)合類型有四種,分別是數(shù)組政溃、元組趾访、枚舉、嵌套董虱。
- 數(shù)組Array 書寫方式array(T) 或者
[T]
- 元組Tuple 書寫方式tuple(T) 或者 (T)
- 枚舉Enum Key/Value形式 Enum8和Enum16分別表示(String:int)和(String:int16),枚舉類型K V不能重復(fù)且不能為null扼鞋,K可以為空字符串
- 嵌套Nested 每個(gè)字段的嵌套層級(jí)只支持一層 嵌套類型本質(zhì)是一種多維數(shù)組的結(jié)構(gòu) 嵌套表中的每個(gè)字段都是一個(gè)數(shù)組,且行與行之間長度無需對(duì)齊 但同一行數(shù)據(jù)內(nèi)的每個(gè)數(shù)組字段的長度必須相等
特殊類型
- Nullable 盡量避免愤诱,會(huì)使查詢和寫入性能變慢
[column].bin -> [column].null.bin
- Domian 域名類型分為IPv4和IPv6兩類
定義數(shù)據(jù)表
數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]
數(shù)據(jù)庫目前支持5種引擎
Ordinary 默認(rèn)引擎
Dictionary 字典引擎云头,此類數(shù)據(jù)庫會(huì)自動(dòng)為所有數(shù)據(jù)字典創(chuàng)建他們的數(shù)據(jù)表
Memory 內(nèi)存引擎,用于存放臨時(shí)數(shù)據(jù)淫半,此類數(shù)據(jù)庫下的數(shù)據(jù)表只會(huì)停留在內(nèi)存中溃槐,不會(huì)涉及任何磁盤操作,當(dāng)服務(wù)重啟后數(shù)據(jù)會(huì)被清掉
Lazy 日志引擎科吭,此類數(shù)據(jù)庫下只能使用Log系列的表引擎
MySQL MySQL引擎昏滴,此類數(shù)據(jù)庫下會(huì)自動(dòng)拉取遠(yuǎn)端MySQL中的數(shù)據(jù)猴鲫,并為他們創(chuàng)建MySQL表引擎的數(shù)據(jù)表
SHOW DATABASES #查看當(dāng)前的數(shù)據(jù)庫列表
USE db_name #切換數(shù)據(jù)庫
SHOW TABLES #查詢可以查看當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)表列表
DROP DATABASES [IF EXISTS] db_name #刪除數(shù)據(jù)庫
數(shù)據(jù)表
- 常規(guī)定義方式
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALTAS expr],
name2 [type] [DEFAULT|MATERIALIZED|ALTAS expr], ...
) ENGINE = engine
- 復(fù)制其他表結(jié)構(gòu)
CREATE TABLE [IF NOT EXISTS] [db_name1.]table_name AS [db_name2.]table_name2 [ENGINE = engine]
- 通過select子句的形式創(chuàng)建相應(yīng)的表結(jié)構(gòu),同時(shí)還會(huì)將select子句查詢的數(shù)據(jù)順帶寫入
CREATE TABLE IF NOT EXISTS table_name_new ENGINE = engine AS SELECT * FROM table_name_origin
默認(rèn)值表達(dá)式
支持三種默認(rèn)值表達(dá)式 DEFAULT|MATERIALIZED|ALTAS谣殊,無論使用哪一種形式拂共,表字段一旦被定義了默認(rèn)值便不再強(qiáng)制要求定義數(shù)據(jù)類型。
臨時(shí)表
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALTAS expr],
name2 [type] [DEFAULT|MATERIALIZED|ALTAS expr], ...
)
相比普通表姻几,臨時(shí)表生命周期是會(huì)話綁定的宜狐,只支持Memory表引擎,會(huì)話結(jié)束表就會(huì)被銷毀蛇捌。
臨時(shí)表不屬于任何數(shù)據(jù)庫肌厨。
臨時(shí)表與普通表重名時(shí),臨時(shí)表的優(yōu)先級(jí)是高于普通表的豁陆。
分區(qū)表
CREATE TABLE table_name (...) ENGINE=MergeTree() PARTITION BY ... ORDER BY ... #建表
SELECT table,partition,path from system.parts WHERE table='table_name' #查詢數(shù)據(jù)表的分區(qū)狀態(tài)
視圖
- 普通視圖
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name AS SELECT ...
視圖不會(huì)存儲(chǔ)任何數(shù)據(jù)柑爸,它只是一層單純的SELECT查詢映射,對(duì)查詢性能不會(huì)有任何增強(qiáng)盒音。
- 物化視圖
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE=engin] [POPULATE] AS SELECT ...
物化視圖創(chuàng)建好后表鳍,如果源表被寫入新數(shù)據(jù),那么物化視圖也會(huì)同步更新祥诽。POPULATE修飾符決定了物化視圖的初始化策略譬圣,如果使用POPULATE修飾符,那么在創(chuàng)建視圖的過程中雄坪,會(huì)連帶將源表中已存在的數(shù)據(jù)一并導(dǎo)入厘熟,反正則沒有數(shù)據(jù)。物化視圖不支持同步刪除维哈,源表刪除后物化視圖數(shù)據(jù)仍會(huì)保留绳姨。使用SHOW TABLE
查看數(shù)據(jù)表列表時(shí) .inner. 特殊前綴的表為物化視圖,可使用DROP TABLE
刪除阔挠。
數(shù)據(jù)表的基本操作
追加新字段
ALTER TABLE tb_name ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [AFTER name_after]
修改數(shù)據(jù)類型
ALTER TABLE tb_name MODIFY COLUMN [IF EXISTS] name [type] [default_expr]
修改備注
ALTER TABLE tb_name COMMENT COLUMN [IF EXISTS] name 'some comment'
刪除已有字段
ALTER TABLE tb_name DROP COLUMN [IF EXISTS] name
移動(dòng)數(shù)據(jù)表
RENAME TABLE [db1.]table1 TO [db2.]table2 ...
清空數(shù)據(jù)表
TRUNCAT TABLE [IF EXISTS] [db.]table
數(shù)據(jù)分區(qū)的基本操作
查詢分區(qū)信息
SELECT partition_id,name,table,database FROM system.parts WHERE table='table_name'
刪除指定分區(qū)
ALTER TABLE tb_name DROP PARTITION partition_expr
復(fù)制分區(qū)數(shù)據(jù)
ALTER TABLE tb_b REPLACE PARTITION partition_expr FROM table_a
前提:兩張表需要擁有相同的分區(qū)鍵飘庄,表結(jié)構(gòu)完全相同。
重置分區(qū)數(shù)據(jù)
ALTER TABLE tb_name CLEAR COLUMN column_name IN PARTITION partition_expr
卸載與裝載分區(qū)
分區(qū)被卸載后物理數(shù)據(jù)并沒有刪除购撼,是被轉(zhuǎn)移到了當(dāng)前表目錄的detached子目錄下跪削。
ALTER TABLE tb_name DETACH PARTITION partition_expr #卸載
ALTER TABLE tb_name ATTACH PARTITION partition_expr #裝載
備份與還原分區(qū)
FREEZE FETCH
分布式DDL
CREATE ALTER DROP RENAME TRUNCAT 都支持分布式執(zhí)行。
CREATE TABLE tb ON CLUSTER cluster_name (...) ...
數(shù)據(jù)寫入
INSERT INTO [db.]table_name [(c1,c2, ...)] VALUES (v1,v2, ...) #values格式插入
INSERT INTO [db.]table_name [(c1,c2, ...)] FORMAT format_name data_set #使用指定格式
INSERT INTO [db.]table_name [(c1,c2, ...)] SELECT ... #使用SELECT插入
數(shù)據(jù)刪除與修改
DELETE UPDATE 是 Mutation語句的變種迂求,它是一種很[重]的操作碾盐,適用于批量數(shù)據(jù)的修改和刪除,一旦提交就會(huì)立刻對(duì)現(xiàn)有數(shù)據(jù)產(chǎn)生影響且不可回滾揩局,它是一個(gè)異步的后臺(tái)過程毫玖,語句提交后就會(huì)立刻返回,所以這并不代表具體邏輯已經(jīng)執(zhí)行完畢,具體進(jìn)度要通過system.mutations
系統(tǒng)表來查詢孕豹。
ALTER TABLE [db.]tb DELETE WHERE filter_expr #刪除
ALTER TABLE [db.]tb UPDATE column1=expr1 [, ...] WHERE filter_expr #更新