clickhouse入门之基础数据类型及数据表

数据类型

基础类型

基础类型只有三种 数值、字符串、时间

  1. 数值
    1.1 数值类型 int (用int8 int16 int32 int64 代表tinyint smallint int bigint) 分别占用 1 2 4 8字节,无符号整数加前缀U表示。
    1.2 浮点数 float (float32 float64 分别占用4 8字节 有效精度分别为7 16位)
    1.3 定点数 decimal (decimal32(S) decimal64(S) decimal128(S) 表示 decimal(1~9, S) decimal(10~18, S) decimal(19~38, S) )

  2. 字符串
    2.1 String
    2.2 FixedString
    2.3 UUID (8-4-4-4-12)

  3. 时间
    3.1 DateTime 精确到秒
    3.2 DateTime64 精确到微秒
    3.3 Date 精确到天

复合类型

复合类型有四种,分别是数组、元组、枚举、嵌套。

  1. 数组Array 书写方式array(T) 或者 [T]
  2. 元组Tuple 书写方式tuple(T) 或者 (T)
  3. 枚举Enum Key/Value形式 Enum8和Enum16分别表示(String:int)和(String:int16),枚举类型K V不能重复且不能为null,K可以为空字符串
  4. 嵌套Nested 每个字段的嵌套层级只支持一层 嵌套类型本质是一种多维数组的结构 嵌套表中的每个字段都是一个数组,且行与行之间长度无需对齐 但同一行数据内的每个数组字段的长度必须相等

特殊类型

  1. Nullable 尽量避免,会使查询和写入性能变慢 [column].bin -> [column].null.bin
  2. Domian 域名类型分为IPv4和IPv6两类

定义数据表

数据库

CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]
数据库目前支持5种引擎
Ordinary 默认引擎
Dictionary 字典引擎,此类数据库会自动为所有数据字典创建他们的数据表
Memory 内存引擎,用于存放临时数据,此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清掉
Lazy 日志引擎,此类数据库下只能使用Log系列的表引擎
MySQL MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为他们创建MySQL表引擎的数据表

SHOW DATABASES                      #查看当前的数据库列表
USE db_name                         #切换数据库   
SHOW TABLES                         #查询可以查看当前数据库的数据表列表
DROP DATABASES [IF EXISTS] db_name  #删除数据库

数据表

  1. 常规定义方式
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
    name1 [type] [DEFAULT|MATERIALIZED|ALTAS expr], 
    name2 [type] [DEFAULT|MATERIALIZED|ALTAS expr], ...
) ENGINE = engine
  1. 复制其他表结构
CREATE TABLE [IF NOT EXISTS] [db_name1.]table_name AS [db_name2.]table_name2 [ENGINE = engine]
  1. 通过select子句的形式创建相应的表结构,同时还会将select子句查询的数据顺带写入
CREATE TABLE IF NOT EXISTS table_name_new ENGINE = engine AS SELECT * FROM table_name_origin

默认值表达式

支持三种默认值表达式 DEFAULT|MATERIALIZED|ALTAS,无论使用哪一种形式,表字段一旦被定义了默认值便不再强制要求定义数据类型。

临时表

CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name (
    name1 [type] [DEFAULT|MATERIALIZED|ALTAS expr], 
    name2 [type] [DEFAULT|MATERIALIZED|ALTAS expr], ...
)

相比普通表,临时表生命周期是会话绑定的,只支持Memory表引擎,会话结束表就会被销毁。
临时表不属于任何数据库。
临时表与普通表重名时,临时表的优先级是高于普通表的。

分区表

CREATE TABLE table_name (...) ENGINE=MergeTree() PARTITION BY ... ORDER BY ...  #建表
SELECT table,partition,path from system.parts WHERE table='table_name' #查询数据表的分区状态

视图

  1. 普通视图
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name AS SELECT ...

视图不会存储任何数据,它只是一层单纯的SELECT查询映射,对查询性能不会有任何增强。

  1. 物化视图
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE=engin] [POPULATE] AS SELECT ...

物化视图创建好后,如果源表被写入新数据,那么物化视图也会同步更新。POPULATE修饰符决定了物化视图的初始化策略,如果使用POPULATE修饰符,那么在创建视图的过程中,会连带将源表中已存在的数据一并导入,反正则没有数据。物化视图不支持同步删除,源表删除后物化视图数据仍会保留。使用SHOW TABLE查看数据表列表时 .inner. 特殊前缀的表为物化视图,可使用DROP TABLE删除。

数据表的基本操作

追加新字段

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 'some comment'

删除已有字段

ALTER TABLE tb_name DROP COLUMN [IF EXISTS] name

移动数据表

RENAME TABLE [db1.]table1 TO [db2.]table2 ...

清空数据表

TRUNCAT TABLE [IF EXISTS] [db.]table

数据分区的基本操作

查询分区信息

SELECT partition_id,name,table,database FROM system.parts WHERE table='table_name'

删除指定分区

ALTER TABLE tb_name DROP PARTITION partition_expr

复制分区数据

ALTER TABLE tb_b REPLACE PARTITION partition_expr FROM table_a

前提:两张表需要拥有相同的分区键,表结构完全相同。

重置分区数据

ALTER TABLE tb_name CLEAR COLUMN column_name IN PARTITION partition_expr

卸载与装载分区

分区被卸载后物理数据并没有删除,是被转移到了当前表目录的detached子目录下。

ALTER TABLE tb_name DETACH PARTITION partition_expr #卸载
ALTER TABLE tb_name ATTACH PARTITION partition_expr #装载

备份与还原分区

FREEZE FETCH

分布式DDL

CREATE ALTER DROP RENAME TRUNCAT 都支持分布式执行。

CREATE TABLE tb ON CLUSTER cluster_name (...) ...

数据写入

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插入

数据删除与修改

DELETE UPDATE 是 Mutation语句的变种,它是一种很[重]的操作,适用于批量数据的修改和删除,一旦提交就会立刻对现有数据产生影响且不可回滚,它是一个异步的后台过程,语句提交后就会立刻返回,所以这并不代表具体逻辑已经执行完毕,具体进度要通过system.mutations系统表来查询。

ALTER TABLE [db.]tb DELETE WHERE filter_expr #删除
ALTER TABLE [db.]tb UPDATE column1=expr1 [, ...] WHERE filter_expr #更新
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容