本文介紹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。
    說明 limitfetch_size都可以限制查詢范圍,但兩者的本質不同,區別在于:
    • limit:可以實現全量或范圍查詢。
    • fetch_size:類似于游標查詢
    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 包含nametype字段,表示查詢字段的名稱和類型。
    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類型的字段,具體使用方式如下。

  1. 創建表結構。
    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"
                            }
                        }
                    }
                }
            }
        }
    }
  2. 批量插入數據。
    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"}}
  3. 根據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"
        ]
      ]
    }
  4. 根據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語法類似。