全部產品
Search
文件中心

Lindorm:SQL文法參考

更新時間:Jun 13, 2025

本文介紹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值)增加而增加。通常用於儲存金額等高精度資料,對於精度要求不高的情境(例如監控),可以使用FLOAT或DOUBLE。定義類型時需要指定P和S。

  • 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模糊比對,以及Regex匹配等過濾條件。

樣本

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')

比較字串字典序。傳回值如下:

  • -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)

該函數用來計算當前行之後若干行的值。該函數可用於直接比較行間差值或進行資料過濾。