本文介紹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模糊比對,以及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') | 比較字串字典序。傳回值如下:
|
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) | 該函數用來計算當前行之後若干行的值。該函數可用於直接比較行間差值或進行資料過濾。 |