本文介紹aliyun-sql插件的查詢語法,包括基礎查詢、游標查詢、JSON格式查詢、translate查詢、特殊語法、自定義UDF函數以及Function和表達式。
說明 本文僅介紹aliyun-sql插件的查詢語法,了解了查詢語法后,您可以在Kibana控制臺上進行測試和使用。具體操作方法,請參見aliyun-sql使用方法。
基礎查詢說明
- 普通查詢
POST /_alisql?pretty { "query": "select * from monitor where host='100.80.xx.xx' limit 5" }
- 查詢時指定返回結果條數
POST /_alisql?pretty { "query": "select * from monitor", "fetch_size": 3 }
- 查詢時指定參數
POST /_alisql?pretty { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }
參數類型 參數名稱 是否必須 示例 描述 URL參數 pretty 否 無 將返回結果格式化顯示。 請求體參數 query 是 select * from monitor where host='100.80.xx.xx' limit 5
具體的SQL查詢語句。 fetch_size 否 3
每次查詢的數據條數。默認值為1000,最大值為10000。如果超過10000,將使用默認最大值10000。 params 否 [{"type":"STRING","value":"100.80.xx.xx"}]
主要實現類似PreparedStatement的功能。 - 查詢返回結果
對于數據量比較大的查詢,首次執行SQL查詢,返回結果中包含的數據條數為fetch_size設置的值,并且包含了游標cursor。
{ "columns": [ { "name": "times", "type": "integer" }, { "name": "value2", "type": "float" }, { "name": "host", "type": "keyword" }, { "name": "region", "type": "keyword" }, { "name": "measurement", "type": "keyword" }, { "name": "timestamp", "type": "date" } ], "rows": [ [ 572575, 4649800.0, "100.80.xx.xx", "china-dd", "cpu", "2018-08-09T08:18:42.000Z" ] ], "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }
參數 說明 columns 包含name和type字段,表示查詢字段的名稱和類型。 rows 查詢結果。 cursor 游標,用于下次查詢。 注意 默認返回結果為1000條,如果返回結果大于1000條,您可以不斷地使用游標查詢(直到無cursor返回或者返回結果為空),獲取剩余的所有數據。
游標查詢
- 查詢請求
POST /_alisql?pretty { "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }
參數類型 參數 是否必須 說明 URL參數 pretty 否 將返回結果格式化顯示。 請求體參數 cursor 是 指定游標值,獲取對應數據。 - 返回結果
{ "rows": [ [ 572547, 3.327459E7, "100.80.xx.xx", "china-dd", "cpu", "2018-08-09T08:19:12.000Z" ] ], "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }
返回結果中的字段與基礎查詢類似,只是為了減少網絡傳輸延遲去掉了columns字段。
JSON格式查詢
- 查詢請求(不支持join查詢)
POST /_alisql?format=org { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }
format=org
:表示將返回結果以JSON格式顯示,其他查詢參數與基礎查詢相同,詳情請參見基礎查詢說明。 - 返回結果
{ "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAsWYXNEdlVJZzJTSXFfOGluOVB4Q3Z****", "took": 18, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.0, "hits": [ { "_index": "monitor", "_type": "_doc", "_id": "2", "_score": 1.0, "_source": { "times": 572575, "value2": 4649800, "host": "100.80.xx.xx", "region": "china-dd", "measurement": "cpu", "timestamp": "2018-08-09T16:18:42+0800" } } ] } }
返回結果和原始DSL(Domain Specific Language)查詢的返回結果格式相同,
_scroll_id
參數用來設置翻頁。
translate查詢
您可以使用translate查詢,將請求的SQL語句轉換為Elasticsearch的DSL語句。
- 查詢請求(不支持join查詢)
POST _alisql/translate { "query": "select * from monitor where host= '100.80.xx.xx' " }
- 返回結果
{ "size": 1000, "query": { "constant_score": { "filter": { "term": { "host": { "value": "100.80.xx.xx", "boost": 1.0 } } }, "boost": 1.0 } }, "_source": { "includes": [ "times", "value2", "host", "region", "measurement", "timestamp" ], "excludes": [] } }
特殊語法
aliyun-sql插件支持查詢nested和text類型的字段,具體使用方式如下。
- 創建表結構。
PUT user_info/ { "mappings":{ "_doc":{ "properties":{ "addr":{ "type":"text" }, "age":{ "type":"integer" }, "id":{ "type":"integer" }, "name":{ "type":"nested", "properties":{ "first_name":{ "type":"keyword" }, "second_name":{ "type":"keyword" } } } } } } }
- 批量插入數據。
PUT user_info/_doc/_bulk?refresh {"index":{"_id":"1"}} {"addr":"467 Hutchinson Court","age":80,"id":"1","name":[{"first_name":"lesi","second_name" : "Adams"},{"first_name":"chaochaosi","second_name" : "Aams"}]} {"index":{"_id":"2"}} {"addr":"671 Bristol Street","age":21,"id":"2","name":{"first_name":"Hattie","second_name" : "Bond"}} {"index":{"_id":"3"}} {"addr":"554 Bristol Street","age":23,"id":"3","name":{"first_name":"Hattie","second_name" : "Bond"}}
- 根據nested類型的
second_name
字段查詢用戶信息。POST _alisql { "query": "select * from user_info where name.second_name='Adams'" }
返回結果如下。{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 1, "467 Hutchinson Court", "lesi", 80, "Adams" ] ] }
- 根據text類型的
addr
字段查詢用戶信息。POST _alisql { "query": "select * from user_info where addr='Bristol'" }
返回結果如下。{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 2, "671 Bristol Street", "Hattie", 21, "Bond" ], [ 3, "554 Bristol Street", "Hattie", 23, "Bond" ] ] }
Function和表達式
類型 | 名稱 | 示例 | 說明 |
---|---|---|---|
Numeric Function | ABS | SELECT ABS(num_field) FROM table |
返回指定數字的絕對值。 |
ACOS | SELECT ACOS(num_field) FROM table |
返回指定數字的反余弦值。 | |
ASIN | SELECT ASIN(num_field) FROM table |
返回指定數字的反正弦值。 | |
ATAN | SELECT ATAN(num_field) FROM table |
返回指定數字的反正切值。 | |
ATAN2 | SELECT ATAN2(num_field1,num_field2) FROM table |
返回兩個指定數字的反正切值。 | |
CEIL | SELECT CEIL(num_field) FROM table |
返回大于等于指定數字的最小整數值。 | |
CBRT | SELECT CBRT(num_field) FROM table |
返回指定數字的雙精度立方根值。 | |
COS | SELECT COS(num_field) FROM table |
返回指定數字的余弦值。 | |
COT | SELECT COT(num_field) FROM table |
返回指定數字的余切值。 | |
DEGREES | SELECT DEGREES(num_field) FROM table |
將弧度值轉換為度。 | |
EXP或EXPM1 | SELECT EXP(num_field) FROM table |
返回e的指定數字的次方冪。 | |
FLOOR | SELECT FLOOR(num_field) FROM table |
返回小于等于指定數字的最大整數值。 | |
SIN | SELECT SIN(num_field) FROM table |
返回指定數字的正弦值。 | |
SINH | SELECT SINH(num_field) FROM table |
返回指定數字的雙曲正弦值。 | |
SQRT | SELECT SQRT(num_field) FROM table |
返回指定數字的正平方根。 | |
TAN | SELECT TAN(num_field) FROM table |
返回指定數字的三角正切值。 | |
ROUND | SELECT ROUND(num_field,2) FROM table |
將指定數字四舍五入到指定的小數位。 | |
RADIANS | SELECT RADIANS (num_field) FROM table |
將以度為單位的角度轉換為以弧度為單位的近似等效角度。 | |
RAND | SELECT RAND() FROM table |
返回一個帶正號的雙精度值,大于或等于0.0且小于1.0。 | |
LN | SELECT LN (num_field) FROM table |
返回指定數字的自然對數。 | |
LOG10 | SELECT LOG10 (num_field) FROM table |
返回指定數字以10為底的自然對數。 | |
PI | SELECT PI() FROM table |
返回PI的值。 | |
POWER | SELECT POWER (num_field,2) FROM table |
返回指定數字的乘冪。 | |
TRUNCATE | SELECT TRUNCATE (num_field,2) FROM table |
返回將指定數字截斷到指定小數位的值。 | |
Arithmetic Operate | + | SELECT (v1 + v2) as v FROM table |
返回兩個數字之和。 |
- | SELECT(v1 - v2) as v FROM table |
返回兩個數字之差。 | |
* | SELECT(v1 * v2) as v FROM table |
返回兩個數字相乘的結果。 | |
/ | SELECT(v1 / v2) as v FROM table |
返回兩個數字相除的結果。 | |
% | SELECT(v1 % v2) as v FROM table |
返回兩個數字相除后的余數。 | |
Logic Operate | AND | SELECT * FROM table WHERE condition AND condition |
返回將兩種情況并運算后,查詢的數據。 |
OR | SELECT * FROM table WHERE condition OR condition |
返回將兩種情況或運算后,查詢的數據。 | |
NOT | SELECT * FROM table WHERE NOT condition |
返回排除某種情況的查詢數據。 | |
IS NULL | SELECT * FROM table WHERE field IS NULL |
返回當指定字段為空時的查詢數據。 | |
IS NOT NULL | SELECT * FROM table WHERE field IS NOT NULL |
返回當指定字段不為空時的查詢數據。 | |
String Function | ASCII | SELECT ASCII(str_field) FROM table |
返回指定字符的ASCII值。 |
LCASE或LOWER | SELECT LCASE(str_field) FROM table |
將指定字符串轉換為小寫。 | |
UCASE或UPPER | SELECT UCASE(str_field) FROM table |
將指定字符串轉換為大寫。 | |
CHAR_LENGTH或CHARACTER_LENGTH | SELECT CHAR_LENGTH(str_field) FROM table |
返回指定字符串的長度(以字節為單位)。 | |
TRIM | SELECT TRIM(str_field) FROM table |
從指定字符串中刪除字首和字尾的空格。 | |
SPACE | SELECT SPACE(num_field) FROM table |
返回指定數量的空格字符的字符串。 | |
LEFT | SELECT LEFT(str_field, 3) FROM table |
從字符串中提取多個字符(從左開始)。 | |
RIGHT | SELECT RIGHT(str_field, 3) FROM table |
從字符串中提取多個字符(從右開始)。 | |
REPEAT | SELECT REPEAT(str_field, 3) FROM table |
返回一個新字符串,表示將原字符串重復指定次數。 | |
REPLACE | SELECT REPLACE(str_field, "SQL", "HTML") FROM table |
用新的子字符串替換字符串中所有出現的子字符串。 | |
POSITION | SELECT POSITION("test" IN str_field) FROM table |
返回子字符串在字符串中首次出現的位置。 | |
REVERSE | SELECT REVERSE(str_test) from table |
反轉字符串并返回結果。 | |
LPAD | SELECT LPAD(str_field, 20, "ABC") FROM table |
從左邊對字符串使用指定的字符進行填充,并指定填充之后字符串的長度。 | |
CONCAT | SELECT CONCAT(str_field,'test') FROM table |
將兩個或多個表達式加在一起。 | |
SUBSTRING | SELECT SUBSTRING(str_field, 5, 3) FROM table |
從字符串中提取子字符串(從任何位置開始)。 | |
Date Function | CURRENT_DATE | SELECT CURRENT_DATE() FROM table |
返回當前日期。 |
CURRENT_TIME | SELECT CURRENT_TIME() FROM table |
返回當前時間。 | |
CURRENT_TIMESTAMP | SELECT CURRENT_TIMESTAMP() FROM table |
返回當前日期和時間。 | |
DAYNAME | SELECT DAYNAME(date_field) FROM table |
返回指定日期的工作日名稱。 | |
DAYOFMONTH | SELECT DAYOFMONTH(date_field) FROM table |
返回指定日期的月份。 | |
DAYOFYEAR | SELECT DAYOFYEAR(date_field) FROM table |
返回指定日期的一年中的一天。 | |
DAYOFWEEK | SELECT DAYOFWEEK(date_field) FROM table |
返回指定日期的星期的索引。 | |
HOUR | SELECT HOUR(date_field) FROM table |
返回指定日期的小時部分。 | |
MINUTE | SELECT MINUTE(date_field) FROM table |
返回指定時間或時間日期的分鐘部分。 | |
SECOND | SELECT SECOND(date_field) FROM table |
返回指定時間或時間日期的秒部分。 | |
YEAR | SELECT YEAR(date_field) FROM table |
返回指定日期的年份部分。 | |
MONTH | SELECT MONTH(date_field) FROM table |
返回指定日期的月份部分。 | |
WEEK | SELECT WEEK(date_field) FROM table |
返回指定日期的星期數(1~54,MySQL的為0~53)。 | |
MONTHNAME | SELECT MONTHNAME(date_field) FROM table |
返回指定日期的月份名稱。 | |
LAST_DAY | SELECT LAST_DAY(date_field) FROM table |
返回指定日期的所在月份的最后一天。 | |
QUARTER | SELECT QUARTER(date_field) FROM table |
返回年份日期的季度值。 | |
EXTRACT | SELECT EXTRACT(MONTH FROM date_field) FROM table |
返回指定日期或時間的單獨部分,例如年、月、日、小時、分鐘等。 | |
DATE_FORMAT | SELECT DATE_FORMAT(date_field,'yyyy') from date_test |
將日期或時間數據格式化輸出。 | |
Aggregation Function | MIN | SELECT MIN(num_field) FROM table |
返回一組值中的最小值。 |
MAX | SELECT MAX(num_field) FROM table |
返回一組值中的最大值。 | |
AVG | SELECT AVG(num_field) FROM table |
返回一組值的平均值。 | |
SUM | SELECT SUM(num_field) FROM table |
返回一組值的總和。 | |
COUNT | SELECT COUNT(num_field) FROM table |
返回指定條件的記錄數。 | |
Advanced Function | CASE | SELECT * FROM table ORDER BY(CASE WHEN exp1 THEN exp2 ELSE exp3 END) |
語法為CASE WHEN THEN ELSE END。當滿足WHEN條件時返回THEN中的值,否則返回ELSE中的值(該值可以在SELECT、WHERE和ORDER中使用)。與IF THEN ELSE語法類似。 |