clickHouse基础语法

news2025/1/20 19:27:31

clichouse数据类型

整形

  • lnt8 8bit,1字节 (-128-127)
  • lnt16 16bit
  • lnt32 32bit
  • lnt64 64bit

无符号整型

相比于上面,就是把负数部分挪到正数部分

  • Ulnt8 (0-255)
  • Ulnt16
  • Ulnt32
  • Ulnt64

浮点型

  • Float32 也就是float
  • Float64 也就是double

布尔型

  • 没有单独的布尔值,可以使用Ulnt8,取值限制为0或1 ,达到相同效果

Decimal

精确存储小数,超过最低有效数字会被丢弃(不是四舍五入)

  • Decimal32(s),相当于Decimal(9-s,s),有效位数为:1-9
  • Decimal64(s),相当于Decimal(18-s,s),有效位数为:1-18
  • Decimal128(s),相当于Decimal(38-s,s),有效位数为:1-38

decimal(10,2)中的“2”表示小数部分的位数,如果插入的值未指定小数部分或者小数部分不足两位则会自动补到2位小数,若插入的值小数部分超过了2为则会发生截断,截取前2位小数。

“10”指的是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过“10-2”位,否则不能成功插入,会报超出范围的错误。

例如Decimal32(5),就是整数加小数一共9位,小数部分为5位

  • 123.12311111结果为:123.12311

字符串

  • String 任意长度的字符串
  • FixedString(N) 固定长度字符串,N必须是正自然数,字符串小于N的时候会追加 空字节 ,大于N会报错

枚举类型

  • Enum8 相当于String - lnt8
  • Enum16 相当于String - lnt16

时间类型

  • Date 年月日
  • Datetime 年月日时分秒
  • Datetime64 年月日时分秒毫秒

数组

  • Array(T) 由T类型元素构成的数组

一般不要使用空,可以给一些默认值,空值会影响性能

--Nullable 表示可以为null
CREATE TABLE 
t_null(
    x Int8,
    y Nullable(Int8)
) ENGINE TinyLog

INSERT INTO t_null VALUES (1, NULL), (2, 3)

还有很多数据类型,详情见官网

https://clickhouse.com/docs/zh/sql-reference/data-types/int-uint

表引擎

引擎大小写敏感

日志家族

  • 需要写入许多小数据量(少于一百万行)的表的场景而开发的:

    • TingLog
    • Log
    • StripeLog
  • 以列文件的形式保存在磁盘上,不支持索引,没有并发控制,一般保存少量数据,生产基本不会用

Memory

  • 内存引擎,数据以未压缩的原始形式保存在内存中,服务器重启数据就会消失,不支持索引,读写操作不会相互阻塞
  • 简单查询效率非常高,超过10G/s,但一般不用,除了测试以外,就是在非常需要高性能且数据量不大的情况下才会考虑(上限大概为1亿行)

集成引擎

  • 例如,数据在mysql,想要通过clickhouse查询mysql的数据,可以把mysql的数据导入clickhouse来查,但是这样会很麻烦,所以提供了这种集成引擎,直接通过clickhouse去mysql中查询数据

有很多种集成,并不真正拥有数据

MergeTree家族(合并树家族)

MergeTree

  • MergeTree以及该系列(*MergeTree)的引擎是clickhouse最强大的引擎,支持索引和分区,相当于innodb于mysql的地位
cd /var/lib/clickhouse/

该目录下,有以下子目录:data是数据,metadata是表信息

image-20221112145128139
clickhouse默认的user表

CREATE TABLE `system`.users (
	name String,
	id UUID,
	storage String,
	auth_type Enum8('no_password' = 0, 'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5),
	auth_params String,
	host_ip Array(String),
	host_names Array(String),
	host_names_regexp Array(String),
	host_names_like Array(String),
	default_roles_all UInt8,
	default_roles_list Array(String),
	default_roles_except Array(String),
	grantees_any UInt8,
	grantees_list Array(String),
	grantees_except Array(String)
) ENGINE = MergeTree()
ORDER BY name;

clickhouse默认记录了数据的条数

分区

​ 分区的目的就是降低扫描的范围,优化了查询速度,例如按照日志分区,就可以快速按照日期去查询,一个分区一个目录,

​ 如果不分区,就会默认一个all分区,也就是把所有的数据放在一个分区

​ 而且分区可以提供并行访问,一个分区一个线程,面对跨分区的查询,clickhouse会以分区为单位并行处理


image-20221112151341030

分区文件命名格式如上图,含义是:

  • 分区值-最小区块编号-最大区块编号-合并层级
  • 分区值:由partiton by 分区主键决定
    • 没有partiton by ,默认生成一个all目录,所有数据存于all目录下
    • 分区键为整型,直接用整型值的字符串作为分区id
    • 分区键为日期类,或者可以转换为日期类型
    • 其他类型的分区键,通过hash算法取hash值作为分区id
  • 最小区块编号
  • 最大区块编号
  • 合并层级

数据的写入于分区合并

  • 任何一次数据写入都会产生新的临时分区,不会纳入任何一个已有的分区,
  • 写入后的某个时刻,大概10-15分钟,会执行合并操作,如果不想等待,也可以手动执行合并操作,把临时分区中的数据合并到已有分区
-- 合并操作:
optimize table 表名 final;
-- 只针对某个分区进行合并
optimize table 表名 partition '分区名'  final;

主键

  • clickhouse主键提供了一级索引,但并不唯一,而且并不是必须的

  • 主键提供的索引为稀疏索引,默认间隔为8192,除非有大量的重复值,一般不需要改这个值,可以减少索引文件的大小,以及快速定位,但是没办法避免在一个区间内的扫描

排序

  • order by() 排序是的必须的,多个字段“,”分开
  • 因为稀疏索引只能确定一个范围,所以数据必须有序,不然就无法通过索引来定位数据
  • 而且操作有序的数据,效率会更高

主键必须是order by的前缀字段,也就是 order by (id,name) ,那么主键就必须是id或者id,name

二级索引

在20.1.2.4之前,二级索引是实验阶段,需要手动开启,后续版本该设置已被删除,默认开启

建表语句如下:

CREATE TABLE test (
	name String,
	id UUID,
	ctime Datetime,
	INDEX a id TYPE minmax GRANULARITY 5
) ENGINE = MergeTree()
ORDER BY (name,id);

INDEX 索引名 字段名 TYPE minmax(索引的一种类型,这里是记录最小和最大值) GRANULARITY(粒度) 5

​ 粒度,指的是在一级索引的前提下,在记录数据的粒度,比如说,有很多重复的数据,一级索引记录的区间为1-10,10-20,20-50等,想要判断35数据在哪一个区间,就需要判断3次,这里的粒度是5,也就是把五个区间合并为一个二级索引,使得区间的范围更大,查找更高效,也就是对于一级索引粒度的粒度

数据TTL

也就是数据存活时间,MergeTree可以单独对表或者列设置过期时间,过期了数据合并后就会变成默认值

CREATE TABLE test (
	name String,
	age UInt8 TTL ctime+interval 10 SECOND,
	ctime Date
) ENGINE = MergeTree()
ORDER BY (name,ctime);

TTL 表中现有的时间列+(加或减固定时间值)interval 10 SECOND(时间单位:秒分时天月等), 这里表中现有的时间列 不能是主键

对于已经建好的表,可以修改列的定义加上ttl

ALTER TABLE 表名 MODIFY COLUMN 列名 列的数据类型 TTL 表中现有的时间列+interval 10 SECOND

表及别的TTL,相等于给所有的列加上过期时间,也可以在建表的时候,在order by 后加上TTL

ALTER TABLE 表名 MODIFY TTL 表中现有的时间列+interval 10 SECOND

ReplacingMergeTree

  • 是MergeTree的一个变种,增加了去重的作用,会根据order by 的字段来去重,
  • 只有在同一批插入(新版本)或者合并的时候去重,所以在合并前是有可能出现重复数据的,只能保证最终的数据不重复
  • 而且如果表经过了分区,去重也只会在分区内部进行,不能跨分区去重
  • 如果出现重复值,会保留ReplacingMergeTree()填的字段,保留该字段最大的值的数据,如果该字段的值也一样或者ReplacingMergeTree()不填,就默认按照插入序,保留最后一条
CREATE TABLE test (
	name String,
	age UInt8 TTL ctime+interval 10 SECOND,
	ctime Date
) ENGINE = ReplacingMergeTree(ctime)
ORDER BY (name,ctime);

SummingMergeTree

  • 是MergeTree的一个变种,因为临时查询时聚合的开销很大,增加了求和功能

  • 提供一种分区内的预聚合,不能跨分区,也不是实时聚合,在同一批次插入(新版本)或者合并的时候会聚合,所以有可能出现没有聚合的情况

  • SummingMergeTree()里填写的是想要聚合的列,可以填多个,但必须是数值,如果不填就会以所有非维度列的字段来汇总(也就是除了order by 的字段),按插入顺序保留第一行

  • 根据order by 的维度(类似于 group by )来聚合

    CREATE TABLE test1 (
    	name String,
    	age UInt8 TTL ctime+interval 10 SECOND,
    	ctime Date
    ) ENGINE = SummingMergeTree(age)
    ORDER BY (name,ctime);
    

    sql语句

insert

和标准sql基本一样

update 和 delete

  • 这类操作被称为Mutation查询,可以看成是alter的一种
  • 虽然可以实现修改和删除,但并不是传统意义上的update 和 delete,不支持事务
  • 而且每次update 和 delete都会放弃目标原有的分区,重新建立分区,所以尽量进行批量操作,不要频繁的小数据操作

语法例如:

alter table 表名  delete where 过滤条件

alter table 表名  update 字段名 = “”  where 过滤条件

​ 具体操作是先新增分区,并把旧的分区变为逻辑失效,直到触发分区合并,才会删除旧的分区

​ 如果真的想要删除更新数据,也可以增加一个版本号,每次取数据的时候,只取版本号最大的数据,这样可以避免删除和更新操作,然后定期清理过期数据。也是一种思路

查询

基本和标准sql也差别不大

  • 支持子查询
  • 支持CTE(with)
  • 支持各种join,但是尽量避免join的使用,而且join语句不支持缓存
  • 窗口函数
  • 不支持自定义函数,官方的函数还是很充足的
  • group by 增加了一些操作(with rollup/cube/total),以group by (a,b)为例
    • rollup上卷,会得到group by (a,b)和group by (a),group by ()
    • cube 维度分析,会得到group by (a,b),group by (a),group by (b),group by ()
    • total,会得到group by (a,b),group by ()

alter

基本和mysql一致

-- 新增字段
alter table 表名 add  column  字段名 字段类型 after column1  ; (这里是指在那一列之后)
-- 修改字段类型
alter table 表名 modify column 列名 字段类型 ;
-- 删除字段
alter table 表名 drop column 列名;

导出

clickhouse-client --password xxxx --query '查询语句' --format CSVWithNames>  导出路径

clickhouse-client --password 123456 --query 'SELECT  * from `system`.aggregate_function_combinators afc' --format CSVWithNames>  /usr/data.csv

其他格式参考官网:

https://clickhouse.com/docs/zh/interfaces/formats

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Instant Neural Graphics Primitives with a Multiresolution Hash Encoding以及源码浅析

背景 现存的一些新视图合成的训练过程和渲染速度都比较慢,其原因是因为query point需要使用MLP编码,而且在一个采样空间中,存在很多无效的query point也要计算其density和color,从而出现很多冗余计算。 作者针对这个问题&#x…

MAUI 中使用 DI 及 MVVM

MAUI 中使用 DI 及 MVVM为什么要使用 依赖注入 和 MVVM如何在 MAUI 中使用依赖注入如何使用 MVVM不使用框架或组件定义一个 BaseViewModelMainViewModel 的实现MainPage 中进行 Binding使用组件优化前面的 ViewModel 代码基项目的效果为什么要使用 依赖注入 和 MVVM MVVM 和 依…

1535_TriCore编译器Tasking使用_汇编分区、内置函数以及伪指令

全部学习汇总: GreyZhang/TriCore_Tasking_Compiler_Skills: Some skills for Tasking compiler on AURIX platform. Happy hacking! (github.com) 看了一下这个章节的内容,原本看着页数很多拆分成了两次学习。后面发现剩下的这部分内容主要并不是框架性…

项目实战——项目上线

ps : 项目要在云服务器上部署,博主自己是用的腾讯云,大家可以选择购买合适的服务器进行部署 目录 一、AC终端操 1、ssh登录服务器 2、创建新用户 3、分配用户 sudo 权限 4、配置免密登录(SSH) 5、传递祖传文件给服务器 6、安…

JetpackCompose从入门到实战学习笔记2——Modifier的简单使用

JetpackCompose从入门到实战学习笔记2——Modifier的简单使用 1.Image的使用: Composable fun Image(modifier: Modifier) {Row {Image(painterResource(id R.mipmap.iv_pic),contentDescription stringResource(R.string.description),modifier modifier.size…

阿里P8熬了一个月肝出这份32W字Java面试手册,传到Git上目前star数达到了30K+

互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000道的Java面试手册我整理了整整1个月,上传到Git上目前star数达到了30K这套互联网Java工程师面试题包括了&am…

【iOS】UITableView的动态Cell高度(Masonry)

动态cell高度评论长度不同引出的问题实现评论长度不同引出的问题 对于之前写的项目的评论部分,由于评论文字字数的不同会导致label高度不同,所以需要设定不同的cell高度来展示。 一开始使用了 CGSize labelSize [label.text boundingRectWithSize:CG…

数据结构与算法_AVL平衡二叉树_四种旋转,插入和删除

1 AVL平衡二叉树的概念 平衡二叉树在BST树基础上加了平衡操作。 BST树特点 :在BST树的基础上,引入了节点“平衡”的概念,任意一个节点的左右子树高度差不超过 1 ,为了维持节点的平衡,引入了四种旋转操作,如…

MySQL的时区引起的前后端数据交互不畅的问题解决

MySQL的时区问题 一、问题起源 在使用swagger2进行代码测试时,执行完成后显示的时间与国内时间少了8个小时 强迫症的原因,就手贱了如下操作 ① 修改MySQL内的时间 set global time_zone 8:00; flush privileges;② show variables like “%time_zone%…

整数除法不用除号

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 *、除号 / 以及求余符号 % 。 注意: 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) 8 以及 truncate(-2…

【路径规划】(2) A* 算法求解最短路,附python完整代码

大家好,今天和各位分享一下机器人路径规划中非常经典的 A* 算法,感兴趣的点个关注,文末有 python 代码,那我么开始吧。 1. 算法介绍 A* 算法是 1968 年 P.E.Hart[1]等人所提出的在全局地图环境中所有已知情形下求解最短路径问题的…

部分gcc预定义宏和函数栈帧的内存分布

本文简单基于树莓派8,linux4.4.50版本,32位arm cpu 尝试了解函数调用栈的内存分布的形态。使用gcc内置的宏 __builtin_frame_address 来打印栈帧内存上的信息,以及了解一下常用的gcc 内置的宏的输出。 针对 __builtin_frame_address 在gcc官网…

猴子也能学会的jQuery第十二期——jQuery遍历(上)

📚系列文章—目录🔥 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

PIC单片机3——外部中断

//RB2&#xff08;INT2&#xff09;作为外中断 #include <p18cxxx.h>/*18F系列单片机头文件*/ void PIC18F_High_isr(void);/*中断服务函数声明*/ void PIC18F_Low_isr(void); #pragma code high_vector_section0x8 /*高优先级中断响应时&#xff0c;会自动跳转到0x8处…

基于三相坐标系状态方程的感应电动机起动动态计算matlab程序

基于三相坐标系状态方程的感应电动机起动动态计算matlab程序 1 异步电动机动态数学模型的性质 电磁耦合是机电能量转换的必要条件&#xff0c;电流与磁通的乘积产生转矩&#xff0c;转速与磁通的乘积得到感应电动势。无论是直流电动机&#xff0c;还是交流电动机均如此。 交、直…

二十七、CANdelaStudio深入-编辑技巧(一致性检查)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio软件的一致性检查,欢迎各位朋友订阅、评论…

『LeetCode|每日一题』---->最小路径和

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』最小路径和 1.每日一题 2.解题思路 2.1 思路分析 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 希望冬天的风能吹散一年里所有的遗憾 2.作者简介 &#x1f3e1;个人主页&#xff1a;XiaoXiaoChen-2716 &#x1f…

Vue3框架中CompositionAPI的基本使用(第十课)

1.Setup函数 理解&#xff1a;Vue3.0中一个新的配置项&#xff0c;值为一个函数。 setup是所有Composition API&#xff08;组合API&#xff09;“ 表演的舞台 ”。 组件中所用到的&#xff1a;数据、方法等等&#xff0c;均要配置在setup中。 setup函数的两种返回值&#x…

kubernetes工作负载之控制器

目录 ​一、概述 二、Deployment 控制器 2.1Deployment 部署应用 2.2Deployment滚动升级 2.2.1应用部署完成 2.2.2更新镜像三种方式 2.3 Deployment 发布失败回滚 2.4Deployment 水平扩容 三、DaemonSet控制器 四、Job控制器 4.1Job一次性执行 4.2定时任务&#xf…

查询:按A分组,满足B时对应的C

1.场景 这种问题我自己归纳为“找对应行”问题&#xff0c;例如有下面一场表&#xff08;学生做题&#xff0c;对每个知识点的得分情况&#xff09; 字段&#xff1a;主键id、user_id、score、is_study、knowledgeName、updateTime场景1&#xff1a;按用户分组&#xff0c;求…