ClickHouse常见数据类型以及常用SQL语法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: ClickHouse常见数据类型以及常用SQL语法

1.数值类型(整形,浮点数,定点数)

(1)整型

(2)固定长度的整型,包括有符号整型或无符号整型 IntX X是位的意思,1Byte字节=8bit位

有符号整型范围
Int8 — [-128 : 127]
Int16 — [-32768 : 32767]
Int32 — [-2147483648 : 2147483647]
Int64 — [-9223372036854775808 : 9223372036854775807]
Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
Int256 — [-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967]
无符号整型范围
UInt8 — [0 : 255]
UInt16 — [0 : 65535]
UInt32 — [0 : 4294967295]
UInt64 — [0 : 18446744073709551615]
UInt128 — [0 : 340282366920938463463374607431768211455]
UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935] 

(3)浮点型(存在精度损失问题)

  • 建议尽可能以整型形式存储数据
  • Float32 - mysql里面的float类型
  • Float64 - mysql里面的double类型
  • (4)Decimal类型
  • 需要要求更高的精度的数值运算,则需要使用定点数
  • 一般金额字段、汇率、利率等字段为了保证小数点精度,都使用 Decimal
  • Clickhouse提供了Decimal32,Decimal64,Decimal128三种精度的定点数
  • 用Decimal(P,S)来定义:
  • P代表精度(Precise),表示总位数(整数部分 + 小数部分)
  • S代表规模(Scale),表示小数位数
  • 例子:Decimal(10,2) 小数部分2位,整数部分 8位(10-2)
  • 也可以使用Decimal32(S)、Decimal64(S)和Decimal128(S)的方式来表示
#测试Decimal类型
(1)创建数据库
CREATE DATABASE test
(2)创建表
CREATE TABLE test.product (
  id UInt64,
  name String, 
  time_stamp Date,
    money Decimal(2,1)
)
ENGINE = MergeTree()
ORDER BY (time_stamp)

ead1fe49bed8453a949597036cb42214.jpg


测试插入
INSERT INTO test.product
VALUES (568239, '商品1', '2021-10-02',2.11 ) 

972f2761ab0e4c3a9ff7db14ea0ed87e.jpg



771fe68c85ce407d8ff91a72e242d77b.jpg

2.字符串类型

(1)UUID

  • 通用唯一标识符(UUID)是由一组32位数的16进制数字所构成,用于标识记录
61f0c404-5cb3-11e7-907b-a6006ad3dba0
  • 要生成UUID值,ClickHouse提供了 generateuidv4 函数。如果在插入新记录时未指定UUID列的值,则UUID值将用零填充
00000000-0000-0000-0000-000000000000
测试
(1)创建表
create TABLE t_uuid (x String,y String) ENGINE = TinyLog
(2)插入数据
INSERT INTO test.t_uuid SELECT generateUUIDv4(), 'Example 1'

2f998e7e44a146ec9de972555a78c9a9.jpg

(2)FixedString固定字符串类型

  • 类似MySQL的Char类型,属于定长字符,固定长度 N 的字符串(N 必须是严格的正自然数)
  • 如果字符串包含的字节数少于`N’,将对字符串末尾进行空字节填充。
  • 如果字符串包含的字节数大于N,将抛出Too large value for FixedString(N)异常。
  • 当数据的长度恰好为N个字节时,FixedString类型是高效的,在其他情况下,这可能会降低效率
  • 应用场景
  • ip地址二进制表示的IP地址
  • 语言代码(ru_RU, en_US … )
  • 货币代码(USD, RUB … )

(3)String字符串类型

  • 字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
  • 字符串类型可以代替其他 DBMSs中的 VARCHAR、BLOB、CLOB 等类型
  • ClickHouse 没有编码的概念,字符串可以是任意的字节集,按它们原本的方式进行存储和输出

3.时间类型

  • Date
  • 日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值,支持字符串形式写入
  • 上限是2106年,但最终完全支持的年份为2105
  • DateTime
  • 时间戳类型。用四个字节(无符号的)存储 Unix 时间戳,支持字符串形式写入
  • 时间戳类型值精确到秒
  • 值的范围: [1970-01-01 00:00:00, 2106-02-07 06:28:15]
  • DateTime64
  • 此类型允许以日期(date)加时间(time)的形式来存储一个时刻的时间值,具有定义的亚秒精度
  • 值的范围: [1925-01-01 00:00:00, 2283-11-11 23:59:59.99999999] (注意: 最大值的精度是8)

4.枚举类型

  • 包括 Enum8Enum16 类型,Enum 保存 'string'= integer 的对应关系
  • 在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。
  • Enum8'String'= Int8 对描述。
  • Enum16'String'= Int16 对描述。
  • 创建一个带有一个枚举 Enum8('ToBePaid' = 1, 'Paid' = 2) 类型的列
#插入成功
INSERT INTO test.pay_emun VALUES ('ToBePaid'), ('Paid')
#查询
SELECT * FROM test.pay_emun


3a6d34c507464b0d906086e92e4f2a14.jpg

5.布尔值

  • 旧版以前没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1
  • 新增里面新增了Bool
#创建表
CREATE TABLE test.t_boolean (
  time_stamp Date,
    is_new Bool
) 
ENGINE = MergeTree()
ORDER BY (time_stamp)
#插入,注意只能插入0或者1否则会报错,0表示false,1表示true
INSERT INTO test.t_boolean VALUES ('2021-10-02', 1) 
INSERT INTO test.t_boolean VALUES ('2021-10-02', 0) 
#查询
select * from test.t_boolean


5de76e850348402899770874b10c3aa8.jpg

6.其他数据类型

#数据库中存储的数据类型,当然不止下图折磨多,具体用的时候再去看
select * from system.data_type_families


aadcb94e12114dda8b8c09df62f169c5.jpg

  • case_insensitive 选项为1 表示大小写不敏感,字段类型不区分大小写
  • 为0 表示大小写敏感,即字段类型需要严格区分大小写

7.ClickHouse与Mysql数据类型对比

ClickHouse Mysql 说明
UInt8 UNSIGNED TINYINT
Int8 TINYINT
UInt16 UNSIGNED SMALLINT
Int16 SMALLINT
UInt32 UNSIGNED INT, UNSIGNED MEDIUMINT
Int32 INT, MEDIUMINT
UInt64 UNSIGNED BIGINT
Int64 BIGINT
Float32 FLOAT
Float64 DOUBLE
Date DATE
DateTime DATETIME, TIMESTAMP
FixedString BINARY

8.常见SQL语法和注意事项

(1)创建表

CREATE TABLE test.order (
    customer_id String, 
    time_stamp Date, 
    click_event_type String,
    page_code FixedString(20),  
    source_id UInt64,
    money Decimal(2,1),
    is_new Bool
) 
ENGINE = MergeTree()
ORDER BY (time_stamp)

(2)查看表结构

DESCRIBE test.order

(3)查询

SELECT * FROM test.order

(4)插入

INSERT INTO test.order
VALUES ('customer2', '2021-10-02', 'add_to_cart', 'home_enter', 568239,2.1, False ) 

(5)更新和删除

  • 在OLAP数据库中,可变数据(Mutable data)通常是不被欢迎的,早期ClickHouse是不支持,后来版本才有
  • 不支持事务,建议批量操作,不要高频率小数据量更新删除
  • 删除和更新是一个异步操作的过程,语句提交立刻返回,但不一定已经完成了
SELECT database, table, command, create_time, is_done FROM system.mutations LIMIT 20

注意事项

  • 每次更新或者删除,会废弃目标数据的原有分区,而重建新分区
  • 例子
  • 如果只更新一条数据,那么需要重建一个分区
  • 如果更新100条数据,而这100条可能落在3个分区上,则需重建3个分区
  • 相对来说一次更新一批数据的整体效率远高于一次更新一行
  • 更新
ALTER TABLE test.order UPDATE  click_event_type = 'pay' where customer_id = 'customer2'; 
  • 删除
ALTER TABLE test.order delete where customer_id = 'customer2';

- 如果更新100条数据,而这100条可能落在3个分区上,则需重建3个分区

- 相对来说一次更新一批数据的整体效率远高于一次更新一行

  • 更新
ALTER TABLE test.order UPDATE  click_event_type = 'pay' where customer_id = 'customer2'; 
  • 删除
ALTER TABLE test.order delete where customer_id = 'customer2';



相关文章
|
1月前
|
SQL 存储 关系型数据库
SQL `CREATE DATABASE` 语法
【11月更文挑战第10天】
63 3
|
1月前
|
SQL 关系型数据库 数据库
sql语法
【10月更文挑战第26天】sql语法
37 5
|
2月前
|
SQL 数据库
SQL数据库基础语法入门
[link](http://www.vvo.net.cn/post/082935.html)
|
2月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
33 0
|
2月前
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
96 0
|
2月前
|
SQL 大数据
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
69 0
|
2月前
|
存储 SQL 分布式计算
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
43 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql(2)—SQL语法详解
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发,旨在处理关系数据模型。
37 0
|
4月前
|
存储 SQL 自然语言处理
|
4月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
49 5
下一篇
DataWorks