本文介绍Lindorm计算引擎支持的数据类型,常用算子和函数。
支持的数据类型
数据类型 | 示例 | 说明 |
TINYINT |
| 微整数类型。长度为1字节。取值范围取决于长度,以及数值中有无符号。 |
SMALLINT |
| 小整数类型。长度为2字节。取值范围取决于长度,以及数值中有无符号。 |
INTEGER |
| 整数类型。长度为4字节。取值范围取决于长度,以及数值中有无符号。 |
BIGINT |
| 大整数类型。长度为8字节。取值范围取决于长度,以及数值中有无符号。 |
BOOLEAN |
| 布尔型。长度为1字节。取值为 |
FLOAT |
| 单精度浮点数。长度为4字节。 |
DOUBLE |
| 双精度浮点数。长度为8字节。使用SQL语句拼写时,可按照科学计数法的方式来表示DOUBLE类型的值。 |
DECIMAL(P[,S]) |
| 可变精度十进制类型,占用存储空间随精度(P值)增加而增加。通常用于存储金额等高精度数据,对于精度要求不高的场景(例如监控),可以使用FLOAT或DOUBLE。定义类型时需要指定P和S。
|
VARBINARY |
| 可变长度的二进制数据类型,用于存储原始的二进制数据。 |
STRING |
| 可变长度字符串类型,最大支持1048576个字符。STRING类型等效于VARCHAR(1048576)。 |
DATE |
| 日期类型,仅存储日期,不存储时间。 |
DATETIME |
| 时间戳类型,用于存储日期和时间的组合值。 |
SQL算子
OLAP资源组兼容Apache Doris算子。常用算子主要有:投影算子、过滤算子、排序算子、翻页算子、聚合算子、公用表表达式、并交补算子、关联算子、窗口算子。
投影算子
子句表达式
SELECT expr0, expr1, ...
算子说明
如SELECT expr1, expr2 FROM tablename
,其中expr1
,expr2
是投影表达式,支持基本的列引用、变换函数、DISTINCT去重算子等,用于生成查询结果。支持使用AS colname对投影结果进行重命名。
示例
SELECT * FROM nation;
SELECT n_name FROM nation;
SELECT lower(n_name) FROM nation;
SELECT DISTINCT n_regionkey FROM nation;
SELECT n_nationkey + 1 FROM nation;
SELECT n_nationkey + 1 AS colname FROM nation;
过滤算子
子句表达式
...WHERE expr0 (AND expr1) ? (OR expr2) ? ...
算子说明
如SELECT * FROM tablename WHERE expr1 AND expr2
,其中expr1
和expr2
是过滤表达式,支持可返回布尔值的表达式,用于过滤出满足查询条件的数据行。支持LIKE模糊匹配,以及正则表达式匹配等过滤条件。
示例
SELECT n_name FROM nation WHERE n_regionkey = 2;
SELECT n_nationkey FROM nation WHERE n_name IN ('CHINA', 'VIETNAM');
SELECT n_name FROM nation WHERE n_nationkey BETWEEN 10 AND 20;
SELECT n_name FROM nation WHERE n_name LIKE 'C%';
SELECT n_name FROM nation WHERE n_name regexp '^(C|U).*';
SELECT n_name FROM nation WHERE n_regionkey IN (SELECT r_regionkey FROM region WHERE r_name = 'ASIA');
排序算子
子句表达式
...ORDER BY expr0, expr1 (ASC | DESC) ?
算子说明
ORDER BY子句,使输出结果按指定列排序展示,支持按升序、降序排列,支持指定NULL值在前还是在后。
示例
SELECT * FROM nation ORDER BY n_name;
SELECT * FROM nation ORDER BY n_name DESC;
SELECT * FROM nation ORDER BY n_name NULLS FIRST;
SELECT * FROM nation ORDER BY n_name NULLS LAST;
翻页算子
子句表达式
... LIMIT (offset, )? limit
算子说明
LIMIT [offset, ] length
子句,也可以写作LIMIT length [OFFSET offset]
,实现输出指定偏移位置指定行数的数据,常和ORDER BY一起使用。
示例
SELECT * FROM nation LIMIT 5;
SELECT * FROM nation LIMIT 5, 10;
SELECT * FROM nation ORDER BY n_name LIMIT 3, 5;
SELECT * FROM nation ORDER BY n_name LIMIT 5 OFFSET 3;
聚合算子
子句表达式
SELECT AGG_FUNC0(expr0), AGG_FUNC1(expr1), ... GROUP BY ...
算子说明
全表聚合或者分组聚合算子,如GROUP BY子句,可以实现数据的分组聚合,统计每组数据的整体特征。也支持通过HAVING子句过滤分组后的数据。
示例
SELECT count(*) FROM nation;
SELECT max(o_totalprice) FROM orders;
SELECT c_nationkey, count(*) FROM customer GROUP BY c_nationkey;
SELECT c_nationkey, count(*) AS user_count FROM customer GROUP BY c_nationkey HAVING user_count > 6000;
公用表表达式
子句表达式
WITH name1 AS (SELECT ...) (, name2 AS (SELECT .... ) )?
算子说明
公用表表达式(Common Table Expression)定义一个临时结果集,可以在SQL语句的范围内多次引用。使用WITH name AS (SELECT ...) [, name2 AS (SELECT ...)]
来表示,可以优化SQL的可读性。
示例
WITH china_users AS (SELECT c_custkey FROM customer WHERE c_nationkey = 18), canada_users AS (SELECT c_custkey FROM customer WHERE c_nationkey = 3) SELECT * FROM china_users UNION ALL SELECT * FROM canada_users;
并交补算子
并集(UNION)
子句表达式
query1 UNION ( ALL | DISTINCT )? query2
算子说明
UNION子句用于合并多个查询的结果,即获取并集。其中UNION DISTINCT与UNION语义相同,代表两个查询结果取并集并去重。而UNION ALL是直接将两个查询结果取并集,不去重。
示例
SELECT n_regionkey FROM nation UNION SELECT n_regionkey FROM nation;
SELECT n_regionkey FROM nation UNION DISTINCT SELECT n_regionkey FROM nation;
SELECT n_regionkey FROM nation UNION ALL SELECT n_regionkey FROM nation;
交集(INTERSECT)
子句表达式
query1 INTERSECT query2
算子说明
INTERSECT 算子用于两个查询结果求交集并去重。展示同时出现在前后两个查询中的数据行,并对结果去重后展示。
示例
SELECT n_name FROM nation INTERSECT SELECT n_name FROM nation;
补集(EXCEPT/MINUS)
子句表达式
query1 ( EXCEPT | MINUS ) query2
算子说明
EXCEPT/MINUS子句用于返回多个查询结果之间的补集,即返回左侧查询中在右侧查询中不存在的数据,并对结果集去重。
示例
SELECT n_name FROM nation EXCEPT SELECT n_name FROM nation;
SELECT n_name FROM nation MINUS SELECT n_name FROM nation;
关联算子
子句表达式
... FROM table1 (LEFT | RIGHT | FULL)? (OUTER | SEMI | ANTI)? JOIN table2 ( ON ... )?
算子说明
关联(JOIN)操作可以按指定规则合并两个表中的数据,并且对结果进行投影计算。OLAP资源组支持SELF JOIN、CROSS JOIN、INNER JOIN、OUTER JOIN、SEMI JOIN和ANTI JOIN。其中,OUTER JOIN包括LEFT JOIN、RIGHT JOIN和FULL JOIN。
示例
SELECT a.n_name, b.n_name FROM nation a, nation b;
SELECT a.n_name, b.n_name FROM nation a JOIN nation b;
SELECT a.n_name, b.n_name FROM nation a CROSS JOIN nation b;
SELECT r_name, n_name FROM nation JOIN region ON nation.n_regionkey = region.r_regionkey;
SELECT r_name, n_name FROM nation, region WHERE r_regionkey = n_regionkey;
SELECT r_name, n_name FROM nation LEFT OUTER JOIN region ON n_regionkey = r_regionkey;
SELECT r_name, n_name FROM nation RIGHT OUTER JOIN region ON n_regionkey = r_regionkey;
SELECT r_name, n_name FROM nation FULL OUTER JOIN region ON n_regionkey = r_regionkey;
SELECT * FROM nation LEFT SEMI JOIN region ON n_regionkey = r_regionkey;
SELECT * FROM nation RIGHT SEMI JOIN region ON n_regionkey = r_regionkey;
SELECT * FROM nation LEFT ANTI JOIN region ON n_regionkey = r_regionkey;
SELECT * FROM nation RIGHT ANTI JOIN region ON n_regionkey = r_regionkey;
窗口函数
子句表达式
... window_function() OVER (PARITION BY ... ORDER BY ... ROWS BETWEEN ... AND ...)
算子说明
窗口函数是内置的特殊函数。和聚合函数类似,窗口函数通过对多行数据计算得到一个数据值。不同的是,窗口函数使用OVER()子句对当前窗口内的数据进行排序和分组,同时对结果集的每一行计算出一个单独的值,而不是对每个GROUP BY分组计算一个值。这种灵活的方式允许您在SELECT子句中增加额外的列,对结果集重新组织和过滤。
窗口函数在金融和科学计算领域较为常用,常被用来分析趋势、计算离群值以及对大量数据进行分桶分析等。
示例
SELECT row_number() OVER (ORDER BY n_regionkey), n_regionkey, n_name FROM nation;
SELECT row_number() OVER (PARTITION BY n_regionkey ORDER BY n_regionkey), n_regionkey, n_name FROM nation;
SELECT o_orderdate, o_totalprice, sum(o_totalprice) OVER (PARTITION BY substr(o_orderdate, 1, 4) ORDER BY o_orderdate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sum FROM orders WHERE o_custkey = 53978 ORDER BY o_orderdate;
常用函数
OLAP查询资源组支持大部分的标准SQL函数,本节介绍部分常用SQL函数的使用示例。
系统信息
函数定义 | 示例 | 说明 |
VARCHAR CATALOG() | CATALOG() | 返回当前所在的Catalog的名字。 |
VARCHAR DATABASE() | DATABASE() | 返回当前所在的Database的名字。 |
VARCHAR CURRENT_USER() | CURRENT_USER() | 返回当前连接的用户。 |
VARCHAR WEBUI() | WEBUI() | 返回资源组的WebUI,与控制台看到的WebUI一致。 |
类型转换与字符串函数
函数定义 | 示例 | 说明 |
CAST (input as type) | CAST('9.2' as double) | 将一种数据类型转换为另一种数据类型。 |
INT CHAR_LENGTH(VARCHAR str) | CHAR_LENGTH("abc") | 返回字符串长度。 |
VARCHAR CONCAT(VARCHAR,...) | CONCAT('b', 'a') | 拼接字符串。 |
INT INSTR(VARCHAR str, VARCHAR substr) | INSTR('alibaba', 'ba') | 查找给定字符串第一次出现的位置,从1开始,0表示未出现。 |
INT STRCMP(VARCHAR lhs, VARCHAR rhs) | STRCMP('abc', 'bbc') | 比较字符串字典序。返回值如下:
|
VARCHAR SUBSTR(VARCHAR str, pos[, len]) | SUBSTR('alibaba', 4) | 返回从指定位置取出部分字符串。 |
VARCHAR LOWER(VARCHAR str) | LOWER('Alibaba') | 将给定字符串转换为全部小写。 |
VARCHAR UPPER(VARCHAR str) | UPPER('Alibaba') | 将给定字符串转换为全部大写。 |
JSON相关函数
函数定义 | 示例 | 说明 |
JSON PARSE_JSON(VARCHAR str) | PARSE_JSON('{"key":"value"}') | 将字符串转换为JSON对象。 |
VARCHAR JSON_STRING(JSON j) | JSON_STRING(json_object_expr) | 将JSON对象转换为字符串。 |
JSON -> VARCHAR path | PARSE_JSON('{"key":"value"}') -> '$.key' | 从JSON对象中读取指定path的元素。 |
JSON_KEYS(VARCHAR | JSON json_obj) | JSON_KEYS('{"a": 1, "b": 2, "c": 3}') | 获取字符串或JSON对象中Key的列表,返回一个数组对象。 |
INT JSON_LENGTH(VARCHAR | JSON json_obj) | JSON_LENGTH('[1, 2, 3]') | 返回JSON对象的元素个数。 |
BOOL JSON_EXISTS(VARCHAR | JSON json_obj, VARCHAR path) | JSON_EXISTS('{"key":1}', '$.key') | 返回JSON对象中是否包含给定路径。 |
INT GET_JSON_INT(VARCHAR | JSON json_obj, VARCHAR path) | GET_JSON_INT('{"key":2}', '$.key') | 返回对应路径的整数值。 |
DOUBLE GET_JSON_DOUBLE(VARCHAR | JSON json_obj, VARCHAR path) | GET_JSON_DOUBLE('{"key":2.2}', '$.key') | 返回对应路径的双精度浮点值。 |
VARCHAR GET_JSON_STRING(VARCHAR | JSON json_obj, VARCHAR path) | GET_JSON_STRING('{"key":{"key2":2}}', '$.key') | 返回对应路径值的字符串表示。 |
JSON_EACH(VARCHAR | JSON json_obj) | SELECT * FROM jsontable, LATERAL JSON_EACH(col_json) | 表函数,只用于LATERAL JOIN,可展开JSON列的值并将其拼在原数据行中,生成若干个数据行。 |
日期与时间函数
函数定义 | 示例 | 说明 |
DATETIME NOW() | NOW() | 返回当前时间,精确到毫秒。 |
DATE CURDATE() | CURDATE() | 返回当前日期。 |
BIGINT UNIX_TIMESTAMP(DATETIME date) | UNIX_TIMESTAMP('2021-01-07 14:13:20') | 将给定时间转换为Unix时间戳。 |
VARCHAR FROM_UNIXTIME(BIGINT unix_timestamp[, VARCHAR string_format]) | FROM_UNIXTIME(1610000000) | 将Unix时间戳按指定格式转换为字符串。 |
BIGINT DATE_DIFF(VARCHAR unit, DATETIME expr1, DATETIME expr2) | DATE_DIFF('hour', '2021-01-07 14:13:20', '2021-01-05 14:13:20') | 计算两个日期的间隔,以每一个参数为单位。 |
DATETIME DATE_ADD(DATETIME|DATE date,INTERVAL expr type) | DATE_ADD('2021-01-07 14:13:20', INTERVAL 2 DAY) | 计算给定日期加上给定间隔的结果。 |
DATETIME DATE_SUB(DATETIME|DATE date,INTERVAL expr type) | DATE_SUB('2021-01-07 14:13:20', INTERVAL 2 DAY) | 计算给定日期减去给定间隔的结果。 |
VARCHAR DATE_FORMAT(DATETIME date, VARCHAR format) | DATE_FORMAT('2021-01-07 14:13:20', '%W %M %Y') | 将给定日期按给定参数格式化为字符串。 |
聚合函数
函数定义 | 示例 | 说明 |
AVG([DISTINCT] expr) |
| 求平均值,可以去重后再求平均值。 |
COUNT(expr) |
|
|
COUNT(DISTINCT expr [,expr,...]) | COUNT(DISTINCT col1, col2) | 返回指定列去重后的行数。 |
COUNT_IF(condition) | COUNT_IF(o_totalprice > 150000) | 返回满足条件的数据行数。 |
MAX(expr) | MAX(o_totalprice) | 返回指定列的最大值。 |
MAX_BY(x,y) | MAX_BY(o_custkey, o_totalprice) | 返回y表达式取最大值的数据行中,对应的x表达式的值。比如订单价最高的订单中的用户ID。 |
MIN(expr) | MIN(o_totalprice) | 返回指定列的最小值。 |
MIN_BY(x,y) | MIN_BY(o_custkey, o_totalprice) | 返回y表达式取最小值的数据行中,对应的x表达式的值。比如订单价最低的订单中的用户ID。 |
SUM([DISTINCT] expr) |
| 返回指定列的和,可以去重后再求和。 |
窗口函数
函数定义 | 示例 | 说明 |
AVG(expr) | AVG( column_name ) | 返回特定窗口内选中字段的平均值。该函数忽略NULL值。 |
COUNT(expr) | COUNT(column_name) | 返回特定窗口内满足要求的行的数目。 |
MAX(expr) | MAX(column_name) | 返回当前窗口指定行数内数据的最大值。 |
MIN(expr) | MIN(column_name) | 返回当前窗口指定行数内数据的最小值。 |
SUM(expr) | SUM(column_name) | 该函数对特定窗口内指定行求和。 |
FIRST_VALUE(expr [IGNORE NULLS]) | FIRST_VALUE(column_name IGNORE NULLS) | 返回窗口范围内的第一个值。 |
LAST_VALUE(expr [IGNORE NULLS]) | LAST_VALUE(column_name IGNORE NULLS) | 返回窗口范围内的最后一个值。与FIRST_VALUE()相反。 |
RANK() | RANK() | 返回当前窗口每行的排名。相同值的行共享同一排名,但后续排名会跳过被占用的位置,返回的序号有可能是不连续的数字。 |
DENSE_RANK() | DENSE_RANK() | 返回一组数值中每个数值的排名。相同值的行共享同一排名,但后续排名不跳过被占用的位置。DENSE_RANK()与RANK()功能相似,但是DENSE_RANK()返回的序号是连续的数字。 例如:前面有两行排名都是1,RANK()第三行会返回3,而DENSE_RANK()第三行仍然会返回2。 |
ROW_NUMBER() | ROW_NUMBER() | 该函数为每个Partition的每一行返回一个从1开始连续递增的整数。与RANK()和DENSE_RANK()不同的是,ROW_NUMBER()返回的值不会重复也不会出现空缺,是连续递增的。 |
LAG(expr [IGNORE NULLS] [, offset[, default]]) | LAG(column_name, 2, 0) | 该函数用来计算当前行之前若干行的值。该函数可用于直接比较行间差值或进行数据过滤。 |
LEAD(expr [IGNORE NULLS] [, offset[, default]]) | LEAD(column_name IGNORE NULLS, 3) | 该函数用来计算当前行之后若干行的值。该函数可用于直接比较行间差值或进行数据过滤。 |