ClickHouse系列之ClickHouse使用
- [1 ClickHouse 数据类型](#1 ClickHouse 数据类型)
-
- [1.1 有符号整数](#1.1 有符号整数)
- [1.2 无符号整数](#1.2 无符号整数)
- [1.3 浮点数](#1.3 浮点数)
- [1.4 字符串类型](#1.4 字符串类型)
-
- [1.4.1 String](#1.4.1 String)
- [1.5 时间类型Date](#1.5 时间类型Date)
- [1.6 DateTime](#1.6 DateTime)
- [2 Clickhouse引擎类型](#2 Clickhouse引擎类型)
-
- [2.1 Log系列引擎](#2.1 Log系列引擎)
-
- [2.1.1 TinyLog引擎](#2.1.1 TinyLog引擎)
-
- [2.1.1.1 建表语法](#2.1.1.1 建表语法)
- [2.1.1.2 示例](#2.1.1.2 示例)
- [2.2 MergeTree系列表引擎](#2.2 MergeTree系列表引擎)
-
- [2.2.1 MergeTree](#2.2.1 MergeTree)
-
- [2.2.1.1 建表语法](#2.2.1.1 建表语法)
- [2.2.1.2 示例](#2.2.1.2 示例)
- [2.2.2 ReplacingMergeTree](#2.2.2 ReplacingMergeTree)
-
- [2.2.2.1 建表语法](#2.2.2.1 建表语法)
- [2.2.2.2 示例](#2.2.2.2 示例)
- [2.2.3 SummingMergeTree](#2.2.3 SummingMergeTree)
-
- [2.2.3.1 建表语法](#2.2.3.1 建表语法)
- [2.2.3.2 示例](#2.2.3.2 示例)
- [2.2.4 AggregatingMergeTree](#2.2.4 AggregatingMergeTree)
-
- [2.2.4.1 建表语法](#2.2.4.1 建表语法)
- [2.2.5 CollapsingMergeTree](#2.2.5 CollapsingMergeTree)
-
- [2.2.5.1 建表语法](#2.2.5.1 建表语法)
- [2.2.6 VersionedCollapsingMergeTree](#2.2.6 VersionedCollapsingMergeTree)
-
- [2.2.6.1 建表语法](#2.2.6.1 建表语法)
- [2.3 数据库引擎](#2.3 数据库引擎)
-
- [2.3.1 MySQL引擎](#2.3.1 MySQL引擎)
-
- [2.3.1.1 建表语法](#2.3.1.1 建表语法)
- [3 ClickHouse使用](#3 ClickHouse使用)
-
- [3.1 Dbeaver 软件安装](#3.1 Dbeaver 软件安装)
- [3.2 增删改查](#3.2 增删改查)
-
- [3.2.1 增加数据](#3.2.1 增加数据)
- [3.2.2 修改数据](#3.2.2 修改数据)
- [3.2.3 删除数据](#3.2.3 删除数据)
- [3.2.4 查询数据](#3.2.4 查询数据)
- [3.3 常用函数](#3.3 常用函数)
-
- [3.3.1 时间函数](#3.3.1 时间函数)
- [3.3.2 字符串函数](#3.3.2 字符串函数)
- [3.3.3 匹配函数](#3.3.3 匹配函数)
1 ClickHouse 数据类型
1.1 有符号整数

1.2 无符号整数

1.3 浮点数

1.4 字符串类型
1.4.1 String
ClickHouse用String表示可变长度的字符串,长度可被认为是没有限制的。
ClickHouse的String统一了关系型数据库中的Varchar、Text、Clob和Blob类型。
ClickHouse的String没有编码的概念(因为同时支持存储文本和二进制),但是建议在存储文本时用UTF-8编码。
1.5 时间类型Date
Date只精确到天,不能指定时区
1.6 DateTime
DateTime精确到秒,可以指定时区。
2 Clickhouse引擎类型
2.1 Log系列引擎
包括TinyLog引擎、StripeLog引擎和Log引擎。TinyLog引擎将数据存储在磁盘上,没有索引,没有标记块,每列都存储在单独的压缩文件中,数据写入时追加写到文件末尾。StripeLog引擎和Log引擎则具有更高的并发读写能力和多线程处理能力。
官方文档:https://clickhouse.com/docs/zh/engines/table-engines/log-family
2.1.1 TinyLog引擎
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。
该引擎没有并发控制:
- 如果同时从表中读取和写入数据,则读取操作将抛出异常;
- 如果同时写入多个查询中的表,则数据将被破坏。
2.1.1.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = TinyLog
2.1.1.2 示例
sql
-- 创建订单表
CREATE TABLE tb_order_tinylog (
id UInt32 COMMENT '主键',
order_number String COMMENT '订单编号',
product_name String COMMENT '商品名称',
product_cate String COMMENT '商品分类',
user_name String COMMENT '用户名称',
order_date Date COMMENT '订单日期',
order_amount Decimal(10, 2) COMMENT '订单金额'
) ENGINE = TinyLog
COMMENT '订单信息';
-- 插入数据
INSERT INTO tb_order_tinylog (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机', '电子产品', '张三', '2024-10-01', 2999.99);
INSERT INTO tb_order_tinylog (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(2, 'ORD00002', '平板电脑', '电子产品', '张三', '2024-10-02', 3999.99);
INSERT INTO tb_order_tinylog (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(3, 'ORD00003', '智能大屏手机', '电子产品', '李四', '2024-10-01', 4599.99);
-- 查询所有数据
select * from tb_order_tinylog;
-- 根据用户分组,查询订单集合、商品名称'总数、总金额、平均金额、最大日期、最小日期
SELECT groupArray(order_number),topK(2)(order_number),any(product_name),user_name,count(*),sum(order_amount),max(order_date),min(order_date),avg(order_amount) from tb_order_tinylog group by user_name;
-- 删除数据会失败,
DELETE from tb_order_tinylog WHERE id = 1
-- 更新操作也会失败
UPDATE tb_order_tinylog SET product_name ='111' where id = 1
select * from tb_order_tinylog 结果:
根据用户分组,查询订单集合、商品名称'总数、总金额、平均金额、最大日期、最小日期,查询结果:
注意:1、TinyLog引擎主要用于存储日志数据,它不支持行级别的删除及更新操作。这是因为TinyLog引擎的目的是高效地追加日志数据,而不是为了频繁的更新或删除操作。2、clickhouse 针对部分函数是大小写敏感的,groupArray 写成grouparray后,clickhouse将报错
2.2 MergeTree系列表引擎
MergeTree(合并树)系列引擎是ClickHouse中最强大的表引擎,是官方主推的存储引擎,几乎支持ClickHouse所有的核心功能。该系列引擎主要用于海量数据分析的场景,支持对表数据进行分区、复制、采样、存储有序、主键索引、稀疏索引和数据TTL等特性。
MergeTree系列引擎的基本理念是当有大量数据要插入到表中时,需要高效地一批一批的写入数据片段,并希望这些数据片段在后台按照一定规则合并,这种方法比插入期间连续重写存储中的数据效率更高。简而言之就是具有批量数据快速插入和后台并发处理的优势。
MergeTree系列引擎支持ClickHouse所有的SQL语法,但还是有一些SQL语法和MySQL并不太一样。
官网文档地址:https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family
2.2.1 MergeTree
MergeTree引擎的表的允许插入主键重复的数据,主键主要作用是生成主键索引来提升查询效率,而不是用来保持记录主键唯一
2.2.1.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
2.2.1.2 示例
sql
CREATE TABLE tb_order_mergetree (
id UInt32 COMMENT '主键',
order_number String COMMENT '订单编号',
product_name String COMMENT '商品名称',
product_cate String COMMENT '商品分类',
user_name String COMMENT '用户名称',
order_date Date COMMENT '订单日期',
order_amount Decimal(10, 2) COMMENT '订单金额'
) ENGINE = MergeTree()
ORDER BY id
COMMENT '订单信息';
-- 插入数据
INSERT INTO tb_order_mergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机', '电子产品', '张三', '2024-10-01', 2999.99);
INSERT INTO tb_order_mergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(2, 'ORD00002', '平板电脑', '电子产品', '张三', '2024-10-02', 3999.99);
INSERT INTO tb_order_mergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(3, 'ORD00003', '智能大屏手机', '电子产品', '李四', '2024-10-01', 4599.99);
-- 插入相同主键的数据,还是能够执行成功
INSERT INTO tb_order_mergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机', '电子产品', '张三', '2024-10-01', 2999.99);
-- 删除数据 ,可以删除成功,
DELETE from tb_order_mergetree WHERE id = 1;
-- 更新数据能够成功
UPDATE tb_order_mergetree SET product_name ='111' where id = 1
数据效果:
注意:在ClickHouse等使用MergeTree引擎的数据库中,主键通常用于数据的排序和分区,并且由于MergeTree引擎的特性,它会确保在主键上的数据是有序的。MergeTree引擎不会强制主键字段的唯一性,需要业务逻辑上会保证主键字段的唯一性,如下,执行插入相同的id也能够插入成功。
2.2.2 ReplacingMergeTree
为了解决MergeTree相同主键无法去重的问题,ClickHouse提供了ReplacingMergeTree引擎,用来对主键重复的数据进行去重。删除重复数据可以使用optimize命令手动执行,这个合并操作是在后台运行的,且无法预测具体的执行时间。在使用optimize命令执行合并时,如果表数据量过大,会导致耗时很长,此时表将是不可用的,因为optimize会通过读取和写入大量数据来完成合并操作。
ReplacingMergeTree适合在后台清除重复数据以节省空间,但不能保证不存在重复数据 。在没有彻底optimize之前,可能无法达到主键去重的效果,比如部分数据已经被去重,而另外一部分数据仍旧存在主键重复的情况。在分布式场景下,相同主键的数据可能被分片到不同节点上,不同分片间无法去重。
ReplacingMergeTree更多的被用于确保数据最终被去重 ,而无法保证查询过程中主键不重复。
2.2.2.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
-- ver参数:ReplacingMergeTree([ver])中的ver参数是可选的,指带有版本的列,这个列允许使用UInt*、Date或DateTime类型。ReplacingMergeTree在合并时会把具有相同主键的所有行仅保留一个。如果不指定ver参数则保留最后一次插入的数据。
-- 【ORDER BY】expr参数:类似于group by 效果,通过expr字段进行去重,保留最新的数据
2.2.2.2 示例
sql
CREATE TABLE tb_order_replacingmergetree (
id UInt32 COMMENT '主键',
order_number String COMMENT '订单编号',
product_name String COMMENT '商品名称',
product_cate String COMMENT '商品分类',
user_name String COMMENT '用户名称',
order_date Date COMMENT '订单日期',
order_amount Decimal(10, 2) COMMENT '订单金额'
) ENGINE = ReplacingMergeTree(id)
ORDER BY id
COMMENT '订单信息';
-- 插入数据
INSERT INTO tb_order_replacingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机', '电子产品', '张三', '2024-10-01', 2999.99);
INSERT INTO tb_order_replacingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(2, 'ORD00002', '平板电脑', '电子产品', '张三', '2024-10-02', 3999.99);
INSERT INTO tb_order_replacingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(3, 'ORD00003', '智能大屏手机', '电子产品', '李四', '2024-10-01', 4599.99);
-- 再次插入id为1的数据,其中在名称后面增加了短横线
INSERT INTO tb_order_replacingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机-', '电子产品-', '张三-', '2024-10-01', 3999.99);
未触发合并前:
optimize table tb_order_replacingmergetree; 手工触发合并
查询数据,发现id为1的数据对应字段已经被最新的数据给替换掉了
注意:MergeTree合并并不是实时触发的,会根据特定的规则进行触发合并,所以在使用时候需要注意该细节点。
2.2.3 SummingMergeTree
ClickHouse通过SummingMergeTree来支持对主键列进行预聚合。 在后台合并时,会将主键相同的多行进行sum求和,然后使用一行数据取而代之,从而大幅度降低存储空间占用,提升聚合计算性能。ClickHouse只在后台Compaction时才会进行数据的预先聚合,而compaction的执行时机无法预测,所以可能会存在一部分数据已经被预先聚合,但仍有一部分数据尚未被聚合的情况。因此在执行聚合计算时,SQL中仍需要使用GROUP BY子句来保证sum的准确 。
在预聚合时,ClickHouse会对主键列以外的其他数值类型列进行预聚合。但这些列必须是数值类型才会计算sum(当sum结果为0时会删除此行数据);如果是String等不可聚合的类型,则随机选择一个值。通常建议将SummingMergeTree与MergeTree配合使用,使用MergeTree来存储明细数据,使用SummingMergeTree存储预聚合的数据来支撑加速查询。
2.2.3.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = SummingMergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
-- 【ORDER BY】expr参数:类似于group by 效果,通过expr字段进行去重
2.2.3.2 示例
sql
CREATE TABLE tb_order_summingmergetree (
id UInt32 COMMENT '主键',
order_number String COMMENT '订单编号',
product_name String COMMENT '商品名称',
product_cate String COMMENT '商品分类',
user_name String COMMENT '用户名称',
order_date Date COMMENT '订单日期',
order_amount Decimal(10, 2) COMMENT '订单金额'
) ENGINE = SummingMergeTree()
ORDER BY id
COMMENT '订单信息';
-- 插入数据
INSERT INTO tb_order_summingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机', '电子产品', '张三', '2024-10-01', 2999.99);
INSERT INTO tb_order_summingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(2, 'ORD00002', '平板电脑', '电子产品', '张三', '2024-10-02', 3999.99);
INSERT INTO tb_order_summingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(3, 'ORD00003', '智能大屏手机', '电子产品', '李四', '2024-10-01', 4599.99);
-- 再次插入id为1的数据,并在部分字段后增加了-
INSERT INTO tb_order_summingmergetree (id, order_number, product_name, product_cate, user_name, order_date, order_amount) VALUES
(1, 'ORD00001', '智能手机-', '电子产品-', '张三-', '2024-10-01', 2999.99);
原始数据:
手动触发合并数据:optimize table tb_order_summingmergetree
合并后数据如下,可以发现,加了横线的新数据未覆盖原始数据,订单金额数据进行了汇总操作:
注意:ClickHouse可能不会完整的汇总所有行,因此我们在查询中使用了聚合函数 sum 和 GROUP BY 子句。
2.2.4 AggregatingMergeTree
AggregatingMergeTree也是预聚合引擎的一种,是在MergeTree的基础上针对聚合函数计算结果进行增量计算用于提升聚合计算的性能。与SummingMergeTree的区别在于:SummingMergeTree对非主键列进行sum聚合,而AggregatingMergeTree则可以指定各种聚合函数。AggregatingMergeTree表适用于增量数据聚合,包括聚合的物化视图。AggregatingMergeTree的语法比较复杂,需要结合物化视图或ClickHouse的特殊数据类型AggregateFunction一起使用。在insert和select时,也有独特的写法和要求:写入时需要使用-State语法,查询时使用-Merge语法。
2.2.4.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = AggregatingMergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[TTL expr]
[SETTINGS name=value, ...]
2.2.5 CollapsingMergeTree
在ClickHouse中不支持对数据update和delete操作(不能使用标准的更新和删除语法操作CK),但在增量计算场景下,状态更新是一个常见的现象,此时update操作似乎更符合这种需求。ClickHouse提供了一个CollapsingMergeTree表引擎,它继承于MergeTree引擎,是通过一种变通的方式来实现状态的更新。
CollapsingMergeTree表引擎需要的建表语句与MergeTree引擎基本一致,惟一的区别是需要指定Sign列(必须是Int8类型) 。这个Sign列有1和-1两个值,1表示为状态行,当需要新增一个状态时,需要将insert语句中的Sign列值设为1;-1表示为取消行,当需要删除一个状态时,需要将insert语句中的Sign列值设为-1。
这其实是插入了两行除Sign列值不同,但其他列值均相同的数据。因为有了Sign列的存在,当触发后台合并时,会找到存在状态行与取消行对应的数据,然后进行折叠操作,也就是同时删除了这两行数据。
状态行与取消行不折叠有两种情况:
- 第一种是合并机制,由于合并在后台发生,且具体的执行时机不可预测,所以可能会存在状态行与取消行还没有被折叠的情况,这时会出现数据冗余;
- 第二种是当乱序插入时(CollapsingMergeTree仅允许严格连续插入),ClickHouse不能保证相同主键的行数据落在同一个节点上,但不同节点上的数据是无法折叠的。
为了得到正确的查询结果,需要将count(col)、sum(col)改写成sum (Sign)、sum(col * Sign)。
如果在业务系统中使用ClickHouse的CollapsingMergeTree引擎表,当状态行已经存在,要插入取消行来删除数据的时候,必须存储一份状态行数据来执行insert语句删除。这种情况下,就有些麻烦,因为同一个业务数据的状态需要我们记录上一次原始态数据,和当前最新态的数据,才能完成原始态数据删除,最新态数据存储到ClickHouse中。
2.2.5.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
-- Sign是列名称,必须是Int8类型,用来标志Sign列。Sign列值为1是状态行,为-1是取消行。
2.2.6 VersionedCollapsingMergeTree
该引擎继承自 MergeTree 并将折叠行的逻辑添加到合并数据部分的算法中,这个引擎:
- 允许快速写入不断变化的对象状态删除后台中的旧对象状态,这显著降低了存储体积
- VersionedCollapsingMergeTree 用于相同的目的 折叠树,但使用不同的折叠算法,允许以多个线程的任何顺序插入数据。 特别是, Version 列有助于正确折叠行,即使它们以错误的顺序插入。
相比之下, CollapsingMergeTree 只允许严格连续插入。
2.2.6.1 建表语法
sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = VersionedCollapsingMergeTree(sign, version)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
-- Sign是列名称,必须是Int8类型,用来标志Sign列。Sign列值为1是状态行,为-1是取消行。
2.3 数据库引擎
ClickHouse提供了本机、MySQL和Lazy这3种数据库引擎,但在默认情况下仅使用其本机数据库引擎,该引擎提供可配置的表引擎(MergeTree、Log和Intergation)和SQL方言(完整的SQL解析器,即递归下降解析器;数据格式解析器,即快速流解析器)。还可以使用MySQL和Lazy。
官方文档:https://clickhouse.com/docs/zh/engines/table-engines/integrations
2.3.1 MySQL引擎
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。
MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此您可以执行诸如SHOW TABLES
或SHOW CREATE TABLE
之类的操作。无法对其执行以下操作:
- RENAME
- CREATE TABLE
- ALTER
2.3.1.1 建表语法
sql
-- 创建Mysql引擎的语法
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
3 ClickHouse使用
3.1 Dbeaver 软件安装
下载地址:https://dbeaver.io/ ,注意下载:DBeaver Community 版本,开源免费
3.2 增删改查
3.2.1 增加数据
sql
insert into [tableName]([columns]) values([])
3.2.2 修改数据
注意:TinyLog引擎不支持修改
sql
alter table [tableName] update column1 = ?,column2 = ? where [condition]
-- where 条件不能为空,如果确认全表进行更新,可增加 1 = 1 的查询条件
3.2.3 删除数据
注意:TinyLog引擎不支持删除
sql
alter table [tableName] delete where [condition]
-- where 条件不能为空,如果确认全表数据删除, where条件可设置为 1 = 1
-- 如果是全表清空,也可以使用 truncate [tablename]的方式进行删除
3.2.4 查询数据
sql
select [* | columns]
from [tableName]
where [condition]
group by [column]
order by [column]
-- 语法与mysql语法基本一致,支持left join ,inner join right join 以及子查询
3.3 常用函数
3.3.1 时间函数
-
生成时间:
- now() :生成当前时间戳
- today():生成当前日期
- yesterday():生成当前日期的前一天
-
时间日期读取:
- toYear():获取日期或时间日期的年份
- toQuarter():获取时间日期的季度
- toMonth():取日期或时间日期的月份
- toDayOfMonth():获取日期或时间日期的天(1-31)
- toDayOfWeek():获取日期或时间日期的星期数值(1-7)
- toHour():获取时间日期的时
- toMinute():获取时间日期的分
- toSecond():获取时间日期的秒
-
时间格式化:
- formatDateTime(date,'%Y-%m-%d %H:%m:%S')
- formatDateTime(date,'%Y-%m-%d %H:%m:%S')
3.3.2 字符串函数
- splitByString([sepator],[str]),字符串切割(sepator分隔符,str:待分隔字符串)
3.3.3 匹配函数
- has([arr],[elem]): 检查 arr 数组中是否存在elem数据