【ClickHouse】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)

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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'

在这里插入图片描述

(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

在这里插入图片描述

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

在这里插入图片描述

6.其他数据类型

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

在这里插入图片描述

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

7.ClickHouse与Mysql数据类型对比

ClickHouseMysql说明
UInt8UNSIGNED TINYINT
Int8TINYINT
UInt16UNSIGNED SMALLINT
Int16SMALLINT
UInt32UNSIGNED INT, UNSIGNED MEDIUMINT
Int32INT, MEDIUMINT
UInt64UNSIGNED BIGINT
Int64BIGINT
Float32FLOAT
Float64DOUBLE
DateDATE
DateTimeDATETIME, TIMESTAMP
FixedStringBINARY

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'; 
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以回答这个问题。要将 ClickHouseSQL 语句转换为 Synapse 语法,您需要了解 Synapse 的语法规则,并根据需要修改 ClickHouseSQL 语句。具体的转换方法可以参考 Synapse 的官方文档或者相关的教程。 ### 回答2: 要将ClickHouseSQL语句转换为Synapse语法,您需要注意以下几个方面: 1. 数据类型ClickHouse和Synapse支持的数据类型可能有所不同。请确保将ClickHouse数据类型转换为Synapse支持的等效类型。例如,将ClickHouse的UInt32转换为Synapse的INT类型。 2. 函数和操作符:ClickHouse和Synapse的函数和操作符可能略有不同。您需要查阅Synapse文档,了解其支持的函数和操作符,并将ClickHouse代码中的函数和操作符转换为Synapse的等效方式。 3. 字符串处理:ClickHouse和Synapse对于字符串的处理方式也可能有所不同。请确保将ClickHouse代码中的字符串处理函数和操作符转换为Synapse的等效方式。 4. 聚合函数:如果您的ClickHouse代码使用了聚合函数,例如SUM或AVG,您需要确保将它们转换为Synapse支持的等效函数,以保证结果的准确性。 5. 分页和排序:ClickHouse和Synapse在分页和排序语法方面也可能有所不同。请确保将ClickHouse代码中的分页和排序语法转换为Synapse的等效方式。 总之,将ClickHouseSQL语句转换为Synapse语法需要您对两者的语法和功能有较为深入的了解。建议您参考Synapse的官方文档,以确保语句转换正确且结果正确无误。 ### 回答3: ClickHouse 是一个高性能、可扩展的分布式列式数据库管理系统,而Synapse 是微软的云数据仓库平台。它们之间的 SQL 语法存在一些差异,以下是将 ClickHouseSQL 语句转换为 Synapse 语法的一些建议。 1. 数据类型转换 - ClickHouse 使用较为特殊的数据类型,需要将其转换为合适的 Synapse 数据类型。例如,ClickHouse 的 UInt64 可以转换为 Synapse 的 BIGINT。 2. 语法差异 - 一些 ClickHouse 特定的语法在 Synapse 中不支持或有不同的实现方式。例如,ClickHouse 使用 `FORMAT` 关键字来指定数据的输出格式,而在 Synapse 中可以使用 `CAST` 函数来实现相似的功能。 3. 函数差异 - Synapse 和 ClickHouse 支持的函数可能有所不同。在将 SQL 语句转换为 Synapse 语法时,需要检查并替换 ClickHouse 特定的函数为 Synapse 支持的等效函数。 4. 日期和时间 - Synapse 使用较为标准的日期和时间格式,而 ClickHouse 对此有自己的实现。在转换 SQL 语句时,需要将日期和时间的处理方式进行调整,以适应 Synapse 的格式要求。 5. 分布式查询 - ClickHouse 和 Synapse 都支持分布式查询,但具体实现方式略有差异。在将 ClickHouseSQL 语句转换为 Synapse 语法时,需要注意分布式查询相关的语法和规则的差异。 总之,将 ClickHouseSQL 语句转换为 Synapse 语法需要根据具体情况进行一些适应性的调整和转换。鉴于 ClickHouse 和 Synapse 的差异较大,可能需要根据实际需求和资源进行具体分析和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网小阿祥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值