0、常用的数据类型
DateTime
Enum
LowCardinality
UInt64
String
Int32
Array
Nested ---> CollapsingMergeTree
1、介绍
ClickHouse 可以在表格单元格中存储各种数据。
本节介绍支持的数据类型以及使用和/或实现它们(如果有)的特殊注意事项。
您可以在system.data_type_families表中检查数据类型名称是否区分大小写。
select * from system.data_type_families;
1.1 数据类型显示
┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐
│ Polygon │ 0 │ │
│ Ring │ 0 │ │
│ Point │ 0 │ │
│ MultiPolygon │ 0 │ │
│ IPv6 │ 0 │ │
│ IntervalSecond │ 0 │ │
│ IPv4 │ 0 │ │
│ UInt32 │ 0 │ │
│ IntervalYear │ 0 │ │
│ IntervalQuarter │ 0 │ │
│ IntervalMonth │ 0 │ │
│ Int64 │ 0 │ │
│ IntervalDay │ 0 │ │
│ IntervalHour │ 0 │ │
│ UInt256 │ 0 │ │
│ Int16 │ 0 │ │
│ LowCardinality │ 0 │ │
│ AggregateFunction │ 0 │ │
│ Nothing │ 0 │ │
│ Decimal256 │ 1 │ │
│ Tuple │ 0 │ │
│ Array │ 0 │ │
│ Enum16 │ 0 │ │
│ IntervalMinute │ 0 │ │
│ FixedString │ 0 │ │
│ String │ 0 │ │
│ DateTime │ 1 │ │
│ Map │ 0 │ │
│ UUID │ 0 │ │
│ Decimal64 │ 1 │ │
│ Nullable │ 0 │ │
│ Enum │ 0 │ │
│ Int32 │ 0 │ │
│ UInt8 │ 0 │ │
│ Date │ 1 │ │
│ Decimal32 │ 1 │ │
│ UInt128 │ 0 │ │
│ Float64 │ 0 │ │
│ SimpleAggregateFunction │ 0 │ │
│ Nested │ 0 │ │
│ DateTime64 │ 1 │ │
│ Int128 │ 0 │ │
│ Decimal128 │ 1 │ │
│ Int8 │ 0 │ │
│ Decimal │ 1 │ │
│ Int256 │ 0 │ │
│ IntervalWeek │ 0 │ │
│ UInt64 │ 0 │ │
│ Enum8 │ 0 │ │
│ DateTime32 │ 1 │ │
│ UInt16 │ 0 │ │
│ Float32 │ 0 │ │
│ INET6 │ 1 │ IPv6 │
│ INET4 │ 1 │ IPv4 │
│ BINARY │ 1 │ FixedString │
│ NATIONAL CHAR VARYING │ 1 │ String │
│ BINARY VARYING │ 1 │ String │
│ NCHAR LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER VARYING │ 1 │ String │
│ NATIONAL CHARACTER LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER │ 1 │ String │
│ NATIONAL CHAR │ 1 │ String │
│ CHARACTER VARYING │ 1 │ String │
│ LONGBLOB │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYBLOB │ 1 │ String │
│ VARCHAR2 │ 1 │ String │
│ CHARACTER LARGE OBJECT │ 1 │ String │
│ DOUBLE PRECISION │ 1 │ Float64 │
│ LONGTEXT │ 1 │ String │
│ NVARCHAR │ 1 │ String │
│ INT1 UNSIGNED │ 1 │ UInt8 │
│ VARCHAR │ 1 │ String │
│ CHAR VARYING │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ NCHAR │ 1 │ String │
│ CHAR │ 1 │ String │
│ SMALLINT UNSIGNED │ 1 │ UInt16 │
│ TIMESTAMP │ 1 │ DateTime │
│ FIXED │ 1 │ Decimal │
│ TINYTEXT │ 1 │ String │
│ NUMERIC │ 1 │ Decimal │
│ DEC │ 1 │ Decimal │
│ TINYINT UNSIGNED │ 1 │ UInt8 │
│ INTEGER UNSIGNED │ 1 │ UInt32 │
│ INT UNSIGNED │ 1 │ UInt32 │
│ CLOB │ 1 │ String │
│ MEDIUMINT UNSIGNED │ 1 │ UInt32 │
│ BOOL │ 1 │ Int8 │
│ SMALLINT │ 1 │ Int16 │
│ INTEGER SIGNED │ 1 │ Int32 │
│ NCHAR VARYING │ 1 │ String │
│ INT SIGNED │ 1 │ Int32 │
│ TINYINT SIGNED │ 1 │ Int8 │
│ BIGINT SIGNED │ 1 │ Int64 │
│ BINARY LARGE OBJECT │ 1 │ String │
│ SMALLINT SIGNED │ 1 │ Int16 │
│ MEDIUMINT │ 1 │ Int32 │
│ INTEGER │ 1 │ Int32 │
│ INT1 SIGNED │ 1 │ Int8 │
│ BIGINT UNSIGNED │ 1 │ UInt64 │
│ BYTEA │ 1 │ String │
│ INT │ 1 │ Int32 │
│ SINGLE │ 1 │ Float32 │
│ FLOAT │ 1 │ Float32 │
│ MEDIUMINT SIGNED │ 1 │ Int32 │
│ BOOLEAN │ 1 │ Int8 │
│ DOUBLE │ 1 │ Float64 │
│ INT1 │ 1 │ Int8 │
│ CHAR LARGE OBJECT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ BIGINT │ 1 │ Int64 │
│ CHARACTER │ 1 │ String │
│ BYTE │ 1 │ Int8 │
│ BLOB │ 1 │ String │
│ REAL │ 1 │ Float32 │
└─────────────────────────────────┴──────────────────┴─────────────┘
2、整数类型
定长整数,带或不带符号。
创建表格时,可以设置整数的数字参数(例如TINYINT(8)、SMALLINT(16)、INT(32)、BIGINT(64)),但 ClickHouse 会忽略它们。
2.1 整数范围
Int8 — [-128 : 127]
Int16 — [-32768 : 32767]
Int32 — [-2147483648 : 2147483647]
Int64 — [-9223372036854775808 : 9223372036854775807]
Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
Int256 - [-57896044618658097711785492504343953926634992332820282019728792003956564819968:57896044618658097711785492504343953926634992332820282019728792003956564819967]
2.2 别名
Int8— TINYINT、BOOL、BOOLEAN、INT1。
Int16- ,。SMALLINTINT2
Int32— INT、INT4、INTEGER。
Int64— BIGINT。
2.3 UInt 范围
UInt8 — [0 : 255]
UInt16 — [0 : 65535]
UInt32 — [0:4294967295]
UInt64 — [0:18446744073709551615]
UInt128 — [0 : 340282366920938463463374607431768211455]
UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]
3、浮点数
我们建议您尽可能以整数形式存储数据。例如,将固定精度数字转换为整数值,例如货币金额或以毫秒为单位的页面加载时间。
Float32— FLOAT。
Float64— DOUBLE。
计算结果取决于计算方法(计算机系统的处理器类型和架构)。
浮点计算可能会产生无穷大 ( Inf) 和“非数字” ( NaN) 等数字。在处理计算结果时应考虑到这一点。
从文本中解析浮点数时,结果可能不是最接近的机器可表示数。
4、Decimal(十进制)
这个要注意的就是,是否会发生溢出行为,以及设置禁用检查
SET decimal_check_overflow = 0;
溢出检查不仅发生在算术运算上,还发生在值比较上:
5、Boolean
这个是没有单独的类型的,可以设置Int8类型的0或者是1
6、String
String 类型替换了其他 DBMS 中的 VARCHAR、BLOB、CLOB 和其他类型。clickhouse不会注意长度等问题,如果您需要存储文本,我们建议使用 UTF-8 编码。至少,如果您的终端使用 UTF-8(按照推荐),您可以读取和写入您的值而无需进行转换。length函数以字节为单位计算字符串长度,而lengthUTF8函数则以Unicode 代码点计算字符串长度。
7、Fixedstring(固定长度)
这个要注意的就是填充问题,带来的空白字符,所以要在查询的时候使用
SELECT *
FROM FixedStringTable
WHERE a = 'b\0';
8、UUID(用户名)
如何使用,clickhouse提供了生成了generateUUIDv4()函数
示例 1
此示例演示如何使用 UUID 类型列创建表并将值插入表中。
CREATE TABLE t_uuid
(
`x` UUID,
`y` String
)
ENGINE = TinyLog;
INSERT INTO t_uuid SELECT
generateUUIDv4(),
'Example 1';
SELECT * FROM t_uuid;
示例 2
在此示例中,插入新记录时未指定 UUID 列值。
INSERT INTO t_uuid (y) VALUES ('Example 2');
UUID 数据类型仅支持String数据类型也支持的函数(例如min、max和count)。
算术运算(例如abs)或聚合函数(例如sum和avg)不支持 UUID 数据类型。
9、日期
9.1 Date
1970-01-01自带的天数,不带时区,但最终完全支持的年份是 2148 年
创建一个带有Date-type 列的表并将数据插入其中:
CREATE TABLE dt
(
`timestamp` Date,
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt VALUES (1546300800, 1), ('2019-01-01', 2);
SELECT * FROM dt;
记住,这个时间的话只能是秒数,也就是10位数的,否则的话会出现结果不一致的情况,而且这个还多了8个小时的时区。只要是同一天的时间在秒数之内的话是没有问题的。
也可以看看
处理日期和时间的函数
用于处理日期和时间的运算符
DateTime数据类型
9.2 Date32
支持与Datetime64相同的日期范围。存储在四个字节中,作为自 1925-01-01 以来的天数。允许将值存储到 2283-11-11。
创建一个带有Date32-type 列的表并将数据插入其中:
CREATE TABLE new
(
`timestamp` Date32,
`event_id` UInt8
)
ENGINE = TinyLog;
目前,还不支持Date32的数据类型
INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2);
SELECT * FROM new;
9.3 DateTime
允许存储瞬间,可以表示为日历日期和一天中的时间。
DateTime([timezone])
支持的值范围:[1970-01-01 00:00:00, 2105-12-31 23:59:59]。分辨率:1秒。
查看时区
SELECT * FROM system.time_zones;
该clickhouse客户端默认应用服务器时区,如果初始化数据类型时,一个时区未明确设置。要使用客户端时区,请clickhouse-client使用--use_client_time_zone参数运行。
ClickHouse 根据date_time_output_format设置的值输出值。YYYY-MM-DD hh:mm:ss默认文本格式。另外,您可以使用formatDateTime函数更改输出。
1.创建一个带有DateTime-type列的表并插入数据:
CREATE TABLE dt
(
`timestamp` DateTime('Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt Values (1546300800, 1), ('2019-01-01 00:00:00', 2);
将日期时间作为整数插入时,它被视为 Unix 时间戳 (UTC)。1546300800代表'2019-01-01 00:00:00'UTC。但是,由于timestamp列Europe/Moscow指定了 (UTC+3) 时区,当输出为字符串时,该值将显示为'2019-01-01 03:00:00'
2.过滤DateTime值
SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Europe/Moscow');
SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00'
3.获取DateTime-type 列的时区:
SELECT toDateTime(now(), 'Europe/Moscow') AS column, toTypeName(column) AS x;
4.时区转换
SELECT
toDateTime(timestamp, 'Europe/London') as lon_time,
toDateTime(timestamp, 'Europe/Moscow') as mos_time
FROM dt;
由于时区转换仅更改元数据,因此该操作没有计算成本。
类型转换函数
处理日期和时间的函数
处理数组的函数
该date_time_input_format设置
该date_time_output_format设置
该timezone服务器配置参数
用于处理日期和时间的运算符
该Date数据类型
9.4 DateTime64
允许存储一个瞬间,可以表示为日历日期和一天中的时间,具有定义的亚秒级精度
刻度大小(精度):10 -精度秒。有效范围:[ 0 : 9 ]。
通常使用 - 3(毫秒)、6(微秒)、9(纳秒)。
DateTime64(precision, [timezone])
支持的范围从 1925 年 1 月 1 日到 2283 年 11 月 11 日。
创建一个带有DateTime64-type 列的表并将数据插入其中:
CREATE TABLE dt
(
`timestamp` DateTime64(3, 'Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2);
与 不同DateTime,DateTime64值不会String自动转换。
获取DateTime64-type 值的时区:
SELECT toDateTime64(now(), 3, 'Europe/Moscow') AS column, toTypeName(column) AS x;
SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Shanghai');
类型转换函数
处理日期和时间的函数
处理数组的函数
该date_time_input_format设置
该date_time_output_format设置
该timezone服务器配置参数
用于处理日期和时间的运算符
Date数据类型
DateTime数据类型
10、Enum
命名值必须'string' = integer成对声明。ClickHouse 仅存储数字,但支持通过名称对值进行操作。
ClickHouse 会自动选择Enum插入数据时的类型。您还可以使用Enum8或Enum16类型来确定存储的大小。
这里我们创建一个带有Enum8('hello' = 1, 'world' = 2)类型列的表:
CREATE TABLE t_enum
(
x Enum('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog;
Columnx只能存储类型定义中列出的值:'hello'或'world'。如果您尝试保存任何其他值,ClickHouse 将引发异常。8 位大小Enum是自动选择的。
如果您需要查看行的等效数字,则必须将Enum值转换为整数类型。
SELECT CAST(x, 'Int8') FROM t_enum;
要在查询中创建 Enum 值,您还需要使用CAST.
SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))
AnEnum可以包含在Nullable类型中。因此,如果您使用查询创建表
CREATE TABLE t_enum_nullable
(
x Nullable( Enum8('hello' = 1, 'world' = 2) )
)
ENGINE = TinyLog;
INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL);
11、LowCardinality(低基数)
LowCardinality(data_type)
data_type— String、FixedString、Date、DateTime和除Decimal之外的数字。LowCardinality对于某些数据类型效率不高,请参阅allow_suspicious_low_cardinality_types设置说明。
使用LowCardinality数据类型的效率取决于数据的多样性。如果字典包含的不同值少于 10,000 个,则 ClickHouse 大多显示出更高的数据读取和存储效率。如果字典包含超过 100,000 个不同的值,则与使用普通数据类型相比,ClickHouse 的性能可能更差。
处理字符串时,请考虑使用LowCardinality而不是Enum。LowCardinality在使用中提供了更大的灵活性,并且通常表现出相同或更高的效率。
创建一个带有LowCardinality-column的表:
CREATE TABLE lc_t
(
`id` UInt16,
`strings` LowCardinality(String)
)
ENGINE = MergeTree()
ORDER BY id;
相关设置和功能
设置:
low_cardinality_max_dictionary_size
low_cardinality_use_single_dictionary_for_part
low_cardinality_allow_in_native_format
allow_suspicious_low_cardinality_types
output_format_arrow_low_cardinality_as_dictionary
职能:
低基数
12、Array
T类型项目的数组。T可以是任何数据类型,包括数组。
您可以使用函数来创建数组:
array(T)
创建数组的示例:
SELECT array(1, 2) AS x, toTypeName(x);
SELECT [1, 2] AS x, toTypeName(x);
在动态创建数组时,ClickHouse 会自动将参数类型定义为可以存储所有列出的参数的最窄数据类型。如果有任何Nullable或文字NULL值,数组元素的类型也变为Nullable。
SELECT array(1, 2, NULL) AS x, toTypeName(x);
所以这个在建表得时候一定要考虑字段是否是为null得情况。。。
可以通过使用size0子列而不读取整列来找到数组的大小。对于多维数组,您可以使用sizeN-1,哪里N是想要的维度。
CREATE TABLE t_arr
(
`arr` Array(Array(Array(UInt32)))
)
ENGINE = MergeTree
ORDER BY tuple();
INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);
13、AggregateFunction
聚合函数可以有一个实现定义的中间状态,可以序列化为AggregateFunction(…)数据类型并存储在表中,通常是通过物化视图。生成聚合函数状态的常用方法是调用带有-State后缀的聚合函数。以后要得到聚合的最终结果,必须使用相同的带-Merge后缀的聚合函数。
AggregateFunction(name, types_of_arguments…) — 参数数据类型。
聚合函数的名称、
聚合函数参数的类型
CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...
uniq、 anyIf ( any + If ) 和分位数是 ClickHouse 支持的聚合函数。
请参阅AggregatingMergeTree引擎说明。
14、Nested
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10;
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10;
您不能对整个嵌套数据结构执行 SELECT。您只能明确列出属于其中的各个列。
对于 INSERT 查询,您应该分别传递嵌套数据结构的所有组件列数组(就像它们是单独的列数组一样)。在插入过程中,系统会检查它们的长度是否相同。
对于 DESCRIBE 查询,嵌套数据结构中的列以相同的方式单独列出。
对嵌套数据结构中元素的 ALTER 查询有限制。
15、元组
元组用于临时列分组。当在查询中使用 IN 表达式以及指定 lambda 函数的某些形式参数时,可以对列进行分组。有关详细信息,请参阅IN 运算符和高阶函数部分。
您可以使用函数来创建元组:
tuple(T1, T2, ...)
创建元组的示例:
SELECT tuple(1,'a') AS x, toTypeName(x)
SELECT tuple(1, NULL) AS x, toTypeName(x)
可以使用索引和名称读取命名元组的元素:
CREATE TABLE named_tuples (`a` Tuple(s String, i Int64)) ENGINE = Memory;
INSERT INTO named_tuples VALUES (('y', 10)), (('x',-10));
SELECT a.s FROM named_tuples;
SELECT a.2 FROM named_tuples;
SELECT
a.s,
a.i
FROM named_tuples;
16、Nullable
允许存储表示“缺失值”的特殊标记(NULL)以及 允许的正常值TypeName。例如,一个Nullable(Int8)类型列可以存储Int8类型值,没有值的行将存储NUL。
案例
CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);
SELECT n.null FROM nullable;
17、特殊的数据类型
17.1 Expression
表达式用于表示高阶函数中的 lambda。
17.2 Set
用于IN表达式的右半部分。
17.3 Nothing
此数据类型的唯一目的是表示不需要值的情况。所以你不能创建一个Nothing类型值。
例如,文字NULL 的类型为Nullable(Nothing). 查看更多关于Nullable 的信息。
该Nothing类型还可用于表示空数组:
SELECT toTypeName(array());
17.4 Interval
表示时间和日期间隔的数据类型系列。INTERVAL运算符的结果类型。
Interval 数据类型值不能存储在表中。
结构:
作为无符号整数值的时间间隔。
间隔类型。
支持的间隔类型:
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
对于每种间隔类型,都有一个单独的数据类型。例如DAY区间对应的IntervalDay数据类型:
SELECT toTypeName(toIntervalDay(4));
您可以Interval在具有Date和DateTime类型值的算术运算中使用-type 值。例如,您可以将当前时间添加 4 天:
SELECT now() as current_date_time, current_date_time + INTERVAL 4 DAY;
select now() as current_date_time,current_date_time + interval 4 day + interval 4 hour;
间隔运算符
toInterval类型转换函数
18、Domains
18.2 IPv4
IPv4是基于UInt32类型的域,用作存储 IPv4 值的类型化替代品。它以人性化的输入输出格式和检查列类型信息提供紧凑的存储。
CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url;
DESCRIBE TABLE hits;
INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.com', '183.247.232.58')('https://clickhouse.com/docs/en/', '116.106.34.242');
SELECT * FROM hits;
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
SELECT toTypeName(s), IPv4NumToString(from) as s FROM hits LIMIT 1;
SELECT toTypeName(i), CAST(from as UInt32) as i FROM hits LIMIT 1;
18.2 IPv6
IPv6是基于FixedString(16)类型的域,用作存储 IPv6 值的类型化替代品。它以人性化的输入输出格式和检查列类型信息提供紧凑的存储。
CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url;
DESCRIBE TABLE hits;
INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.com', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.com/docs/en/', '2a02:e980:1e::1');
SELECT * FROM hits;
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
SELECT toTypeName(s), IPv6NumToString(from) as s FROM hits LIMIT 1;
SELECT toTypeName(i), CAST(from as FixedString(16)) as i FROM hits LIMIT 1;
19 Multiword Types
创建表时,您可以使用名称由多个单词组成的数据类型。这是为了更好的 SQL 兼容性而实现的。
Multiword types | Simple types |
DOUBLE PRECISION | Float64 |
CHAR LARGE OBJECT | String |
CHAR VARYING | String |
CHARACTER LARGE OBJECT | String |
CHARACTER VARYING | String |
NCHAR LARGE OBJECT | String |
NCHAR VARYING | String |
NATIONAL CHARACTER LARGE OBJECT | String |
NATIONAL CHARACTER VARYING | String |
NATIONAL CHAR VARYING | String |
NATIONAL CHARACTER | String |
NATIONAL CHAR | String |
BINARY LARGE OBJECT | String |
BINARY VARYING | String |
20、Geo Data Types
ClickHouse 支持用于表示地理对象的数据类型——位置、土地等。
警告
目前,地理数据类型是一项实验性功能。要使用它们,您必须设置allow_experimental_geo_types = 1.
另请参阅-表示简单的地理特征。- allow_experimental_geo_types设置。
Point由其 X 和 Y 坐标表示,存储为元组(Float64、Float64)。
SET allow_experimental_geo_types = 1;
CREATE TABLE geo_point (p Point) ENGINE = Memory();
INSERT INTO geo_point VALUES((10, 10));
SELECT p, toTypeName(p) FROM geo_point;
20.1 Ring
SET allow_experimental_geo_types = 1;
CREATE TABLE geo_ring (r Ring) ENGINE = Memory();
INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT r, toTypeName(r) FROM geo_ring;
20.2 Polygon
Polygon是一个带孔的多边形,存储为环数组:Array ( Ring )。外部数组的第一个元素是多边形的外形,后面的元素都是孔。
SET allow_experimental_geo_types = 1;
CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory();
INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]);
SELECT pg, toTypeName(pg) FROM geo_polygon;
20.3 MultiPolygon
这个多面体由两个独立的多边形组成——第一个没有孔,第二个有一个孔:
SET allow_experimental_geo_types = 1;
CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory();
INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]);
SELECT mpg, toTypeName(mpg) FROM geo_multipolygon;
21、Map(key, value)
map 目前还只是一个实验性的数据类型
set allow_experimental_map_type = 1;
Map(key, value)数据类型存储key:value对。
Map(key, value)数据类型存储key:value对。
参数
key——这对的关键部分。String、Integer、LowCardinality或FixedString。
value— 对的值部分。String、Integer、Array、LowCardinality或FixedString。
要从a Map('key', 'value')列中获取值,请使用a['key']语法。此查找现在以线性复杂度工作。
CREATE TABLE table_map (a Map(String, UInt64)) ENGINE=Memory;
INSERT INTO table_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});
SELECT a['key2'] FROM table_map;
如果列中没有这样key的内容Map(),则查询为数值、空字符串或空数组返回零。
INSERT INTO table_map VALUES ({'key3':100}), ({});
SELECT a['key3'] FROM table_map;
你可以投Tuple()作为Map()使用CAST功能:
SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
为了优化Map列处理,在某些情况下,您可以使用keys和values子列而不是读取整列。
CREATE TABLE t_map (`a` Map(String, UInt64)) ENGINE = Memory;
INSERT INTO t_map VALUES (map('key1', 1, 'key2', 2, 'key3', 3));
SELECT a.keys FROM t_map;
SELECT a.values FROM t_map;
地图()函数
CAST()函数
22、SimpleAggregateFunction
支持以下聚合函数:
any
anyLast
min
max
sum
sumWithOverflow
groupBitAnd
groupBitOr
groupBitXor
groupArrayArray
groupUniqArrayArray
sumMap
minMap
maxMap
笔记
SimpleAggregateFunction(func, Type)外观值和存储方式与 相同Type,因此您不需要应用带有-Merge/-State后缀的函数。
SimpleAggregateFunction具有比AggregateFunction相同聚合函数更好的性能。
参数
聚合函数的名称。
聚合函数参数的类型。
CREATE TABLE simple (id UInt64, val SimpleAggregateFunction(sum, Double)) ENGINE=AggregatingMergeTree ORDER BY id;
Clickhouse每日一练,希望大佬能多多给宝贵意见,拿小本子记着。。。