SQL语法参考

本文介绍Lindorm计算引擎支持的数据类型,常用算子和函数。

支持的数据类型

数据类型

示例

说明

TINYINT

127

微整数类型。长度为1字节。取值范围取决于长度,以及数值中有无符号。

SMALLINT

32767

小整数类型。长度为2字节。取值范围取决于长度,以及数值中有无符号。

INTEGER

2147483647

整数类型。长度为4字节。取值范围取决于长度,以及数值中有无符号。

BIGINT

9223372036854775807

大整数类型。长度为8字节。取值范围取决于长度,以及数值中有无符号。

BOOLEAN

true

布尔型。长度为1字节。取值为truefalse

FLOAT

1.234

单精度浮点数。长度为4字节。

DOUBLE

1.23456

双精度浮点数。长度为8字节。使用SQL语句拼写时,可按照科学计数法的方式来表示DOUBLE类型的值。

DECIMAL(P[,S])

4873.6293048479

可变精度十进制类型,占用存储空间随精度(P值)增加而增加。通常用于存储金额等高精度数据,对于精度要求不高的场景(例如监控),可以使用FLOATDOUBLE。定义类型时需要指定PS。

  • P:最大一共有多少位,值域是[1,38]。

  • S:小数点后最大有多少位,值域是[0,P]。

VARBINARY

x'baba'

可变长度的二进制数据类型,用于存储原始的二进制数据。

STRING

'abcde'

可变长度字符串类型,最大支持1048576个字符。STRING类型等效于VARCHAR(1048576)。

DATE

'2025-04-15'

日期类型,仅存储日期,不存储时间。

DATETIME

'2025-04-15 00:00:00.123456'

时间戳类型,用于存储日期和时间的组合值。

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,其中expr1expr2是过滤表达式,支持可返回布尔值的表达式,用于过滤出满足查询条件的数据行。支持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 DISTINCTUNION语义相同,代表两个查询结果取并集并去重。而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 JOINANTI JOIN。其中,OUTER JOIN包括LEFT JOIN、RIGHT JOINFULL 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')

比较字符串字典序。返回值如下:

  • -1:lhs在字典序中小于rhs。

  • 0:lhs在字典序中等于rhs。

  • 1:lhs在字典序中大于rhs。

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)

  • AVG(o_totalprice)

  • AVG(DISTINCT o_totalprice)

求平均值,可以去重后再求平均值。

COUNT(expr)

  • COUNT(*)

  • COUNT(col_name)

  • COUNT(*)返回所有行数。

  • COUNT(col_name)返回指定列不为NULL的行数。

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)

  • SUM(o_totalprice)

  • SUM(DISTINCT o_totalprice)

返回指定列的和,可以去重后再求和。

窗口函数

函数定义

示例

说明

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)

该函数用来计算当前行之后若干行的值。该函数可用于直接比较行间差值或进行数据过滤。