UUID
uuid类型可以求min,max,计数,但是不能sum
1-- 创建表
CREATE TABLE t_uuid (id UUID, name String) ENGINE=TinyLog
-- 插入数据
INSERT INTO t_uuid SELECT generateUUIDv4(), '张三'
-- 查询数据
SELECT * FROM t_uuid
-- 测试函数
SELECT min(id),name FROM t_uuid group by id,name;
┌───────────────────────────────────id─┬─name─┐
│ d1a17b22-cfe9-4382-b9f3-6d34e5509a19 │ 张三 │
└──────────────────────────────────────┴──────┘
SELECT sum(id),name FROM t_uuid
--- 如下出错
Code: 43. DB::Exception: Received from localhost:9009. DB::Exception: Illegal type UUID of argument for aggregate function sum.
Datetime64
--创建表
CREATE TABLE dt (`timestamp` DateTime64(3, 'Asia/Shanghai'),`event_id` UInt8) ENGINE = TinyLog;
-- 插入时间
INSERT INTO dt Values (1604321946067, 1), ('2020-11-02 20:58:54', 2)
--查询
SELECT * FROM dt
┌───────────────timestamp─┬─event_id─┐
│ 2020-11-02 20:59:06.067 │ 1 │
│ 2020-11-02 20:58:54.000 │ 2 │
└─────────────────────────┴──────────┘
--获取一个时区 DateTime64-类型值:
SELECT toDateTime64(now(), 3, 'Asia/Shanghai') AS column, toTypeName(column) AS x
-- 时区转换
SELECT toDateTime64(timestamp, 3, 'Europe/Moscow') as mos_time,FROM dt
-- 过滤出 DateTime64 值
SELECT * FROM dt WHERE timestamp = toDateTime64('2020-11-02 20:58:54', 3, 'Asia/Shanghai')
Decimal
有符号的定点数,可在加、减和乘法
运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
--保留四位小数
SELECT toDecimal32(200, 4) AS x, x / 3;
+--------+------------------------------+
|x |divide(toDecimal32(200, 4), 3)|
+--------+------------------------------+
|200.0000|66.6666 |
+--------+------------------------------+
--保留两位小数
select toDecimal32(200,2);
+-------------------+
|toDecimal32(200, 2)|
+-------------------+
|200.00 |
+-------------------+
Float32,Float64
将固定精度的数字转换为整数值,例如货币数量或页面加载时间用毫秒为单位表示
Float32
-float
Float64
-double
---对浮点数进行计算可能引起四舍五入的误差。
SELECT 1 - 0.9
+-------------------+
|minus(1, 0.9) |
+-------------------+
|0.09999999999999998|
+-------------------+
Tuple
元组,其中每个元素都有单独的类型
不能在表中存储元组(除了内存表)。它们可以用于临时列分组。
-- 创建元组
SELECT tuple(1,'a') AS x, toTypeName(x);
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
select tuple(1,'a','b') as x,toTypeName(x);
+-----------+------------------------------+
|x |toTypeName(tuple(1, 'a', 'b'))|
+-----------+------------------------------+
|(1,'a','b')|Tuple(UInt8, String, String) |
+-----------+------------------------------+
-- 自动数据类型检测示例
SELECT tuple(1, NULL) AS x, toTypeName(x)
┌─x────────┬─toTypeName(tuple(1, NULL))──────┐
│ (1,NULL) │ Tuple(UInt8, Nullable(Nothing)) │
└──────────┴─────────────────────────────────┘
SELECT tuple(1, NULL) AS x, toTypeName(x) as y;
+--------+-------------------------------+
|x |y |
+--------+-------------------------------+
|(1,NULL)|Tuple(UInt8, Nullable(Nothing))|
+--------+-------------------------------+
-- as可以省略
SELECT tuple(1, NULL) x, toTypeName(x) y;
UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64
整型范围
- Int8-[-128:127]
- Int16-[-32768:32767]
- Int32-[-2147483648:2147483647]
- Int64-[-9223372036854775808:9223372036854775807]
无符号整型范围
- UInt8-[0:255]
- UInt16-[0:65535]
- UInt32-[0:4294967295]
- UInt64-[0:18446744073709551615]
可为空(类型名称)
允许用特殊标记 (NULL) 表示«缺失值»,可以与 TypeName
的正常值存放一起。例如,Nullable(Int8)
类型的列可以存储 Int8
类型值,而没有值的行将存储 NULL
。
create table t_null
(
x Int8,
y Nullable(INT)
) ENGINE TinyLog;
insert into t_null values (1,null),(2,3);
select *
from t_null;
+-+----+
|x|y |
+-+----+
|1|NULL|
|2|3 |
+-+----+
-- 报错,内型不匹配,因为建表定义了Int
insert into t_null values (1,'ce');
字符串
字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
布尔值
没有单独的类型来存储布尔值。可以使用 UInt8
类型,取值限制为 0 或 1。
数组
由 T
类型元素组成的数组。
T
可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
-- 创建数组
array(T) 或者[]
SELECT array(1, 2) AS x, toTypeName(x);
+-----+-----------------------+
|x |toTypeName(array(1, 2))|
+-----+-----------------------+
|[1,2]|Array(UInt8) |
+-----+-----------------------+
-- 自动数据类型检测示例:
SELECT array(1, 2, NULL) AS x, toTypeName(x);
+----------+-----------------------------+
|x |toTypeName(array(1, 2, NULL))|
+----------+-----------------------------+
|[1,2,NULL]|Array(Nullable(UInt8)) |
+----------+-----------------------------+
-- 如果数据值不同会出错,因为array类型里面的数据类型要一致,比如都是整数
SELECT array(1, 'a')
SELECT [1, 'a']
Received exception from server (version 20.5.2):
Code: 386. DB::Exception: Received from localhost:9009. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.
--数组还可以这么表示
select [1,2] as x,toTypeName(x);
+-----+------------------+
|x |toTypeName([1, 2])|
+-----+------------------+
|[1,2]|Array(UInt8) |
+-----+------------------+
总结
clickhouse
的数据类型还是非常丰富的