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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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';



相关文章
|
6天前
|
存储 传感器 网络协议
ClickHouse 数据类型、表引擎与TTL
ClickHouse数据类型包括UInt8、Int64等,对应Java的Short、Long等,支持数字、字符串、日期时间、数组、枚举、UUID和IP地址等多种类型。建表时需确定好数据类型,避免后期转换影响效率。不要使用Nullable类型,因其低效。合理设置分区和索引,避免轻量删除和修改操作。表引擎如TinyLog适合小规模数据,MergeTree适用于有序时间序列,ReplacingMergeTree用于替换更新数据,AggregatingMergeTree和SummingMergeTree做聚合计算,CollapsingMergeTree保留最新状态。
|
8天前
|
SQL 存储 关系型数据库
SQL 语法
SQL 语法
19 2
|
9天前
|
SQL Java 数据库连接
实时计算 Flink版产品使用合集之怎么将MyBatis-Plus集成到SQL语法中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
9天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之sql读取mysql写入clickhouse,该如何操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
15天前
|
SQL 流计算 API
实时计算 Flink版产品使用合集之ClickHouse-JDBC 写入数据时,发现写入的目标表名称与 PreparedStatement 中 SQL 的表名不一致如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
23 0
|
15天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之在使用Flink SQL向ClickHouse写入数据的过程中出现丢数据或重复数据的情况如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
17天前
|
SQL 关系型数据库 数据库
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
|
17天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句
|
17天前
|
SQL 存储 数据库
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
|
17天前
|
SQL 关系型数据库 MySQL
【MySQL-4】简述SQLの通用语法及4种基本语句介绍(DDL/DML/DQL/DCL)
【MySQL-4】简述SQLの通用语法及4种基本语句介绍(DDL/DML/DQL/DCL)

热门文章

最新文章

http://www.vxiaotou.com