InfluxQL 是 SQL LIKE 語法,所以整體而言的語法很 SQL 沒有太大的區別,以下文件假定使用者了解SQL語法,因此只簡列出特別需要注意的部分。以下為目錄:

SELECT ... FROM ...

用於從 FROM 指定的 measurement,將 SELECTfieldstags 顯示出來。
  • SELECT * 表示返回所有的 field_key tag_key
  • 當需要 SELECT tag_key 時,至少需要包含一個 field_key,否則不會返回任何結果,這是有關於數據儲存方式的結果。
  • SELECT "<field_key>"::field,"<tag_key>"::tag 其中 ::[field | tag] 是用來區分擁有相同名稱的 field_keytag_key,當同名沒有指定 ::[field | tag] 時,預設會是顯示 field key
    • 範例:
  • SELECT 不可在使用 聚合函數 時,包含 非聚合函數field keytag key。也就是相當於 MySQL 中 sql_mode 包含 ONLY_FULL_GROUP_BY 的情況。
    • FROM <database_name>.<retention_policy_name>.<measurement_name> 可以使用此方式指定到特定 databaseretention policymeasurement
    • FROM <database_name>..<measurement_name> 此方式會指定到對應 database 使用 DEFAULT RP 的 measuremen
    • FROM <measurement_name>,<measurement_name> 會傳回多個 measurement 的數據。
      • 引號的規則和 line protocol 不同,規則如下:
          1. ' 用於 Stringtimestamp values,請勿用於標識符(database names, retention policy names, user names, measurement names, tag keys, and field keys)。
          1. " 用於標識符,標識符database names, retention policy names, user names, measurement names, tag keys, and field keys)。

      WHERE

      只顯示符合 WHERE 條件的資料。

      Fields

      • String field value 必須使用 ' 包起來,否則不會返回數據,並起大部分時候不會返回錯誤。
      • operator 支援:=<>!=>>=<<=、算術運算符和正則表達式。

      Tags

      • tag value 必須使用 ' 包起來,否則不會返回數據,並起大部分時候不會返回錯誤。
      • operator 支援:=<>!= 和 正則表達式。

      Timestamp

      • 預設值為 (UTC) 1677-09-21 00:12:43.145224194 ~ 2262-04-11T23:47:16.854775806Z
      • 當包含 GROUP BY time() 時,預設值為 (UTC) 1677-09-21 00:12:43.145224194 ~ now()
      • 不支持在 time 上使用 OR 指定多個時間範圍,對於該查詢會返回空結果。

      SELECT INTO

      SELECT 的結果寫入到 INTO 指定的 measurement
      • 可用於 RENAME DATABASE,如下範例:
          1. test DB 下 autogen RP 的資料寫入到 copy_test DB 下 autogen RP 。
          1. 反向引用語法 <:MEASUREMENT>copy_test DB 中 measurement 名稱引用 test DB 中的名稱。請注意在執行前必須確保 copy_test DB 及 autogen RP 存在。
          1. 若語法中未包含 GROUP BY * 在新的 measurementtag 會被轉為 field
          1. 當移動大量數據時,建議在 WHERE 條件中加入時間條件分批寫入,避免系統內存不足。
      • 經常用於採樣,將高精度的資料透過 functiongroup by 聚合成低精度的數據。
      • 由於當語法中未包含 GROUP BY * 時,原表的 tag 在新表將被轉換為 field,因此原本用 tag 區別的數據被 overwrite,這可能導致數據的丟失。若要保留 tag 請務必加上 GROUP BY *

      GROUP BY

      將數據依照 GROUP BY 指定的 tag key時間區間 進行分組並聚合。

      tags

      • GROUP BY * 會透過所有的 tag_key 來聚合結果。

      time()

      • time(time_interval):InfluxDB 根據 time_interval 對時間範圍進行分組,分組出來的結果包下不包上。如下範例:
        • time_interval 的格式為 uint + time unitstime units 可參考以下表格:
          notion image
      • time(time_interval,offset_interval): InfluxDB 根據 offset_interval 調整時間邊界,並根據 time_interval 對時間範圍進行分組。
        • offset_interval 的格式為 int(可以為負) + time units
          當未指定 offset_interval 時,InfluxDB會以預設的時間邊界開始分組。如下範例:
      • fill(<fill_option>):選填,預設情況下當組別沒有資料時會返回 NULL,該選項用來改變當沒有資料時返回的結果。
        • fill_option 有以下值-
          1. null:包含該組別但值返回 NULL,此為默認值。
            1. numerical value:返回該數值。
              1. linear: 根據 linear interpolation 顯示值。
                1. none:不顯示該組別。
                  1. previous:顯示前一個組別的結果。

                ORDER BY time

                將結果按照時間排序。
                • 預設使用 ASC 排序
                • 在 influxQL 中只能用 time 排序

                LIMIT and SLIMIT

                LIMIT <N>

                LIMIT <N> 返回前 NPoints

                SLIMIT <N>

                SLIMIT <N> 返回前 NSeries 的所有 Points,注意必須要搭配 GROUP BY 才能使用。

                LIMIT <N1> SLIMIT <N2>

                返回 N2Series,每個 Series 返回 N1Points

                OFFSET and SOFFSET

                OFFSET <N>

                返回資料時,跳過前面 NPoints

                SOFFSET <N>

                返回資料時,跳過前面 NSeries,注意必須要搭配 GROUP BYSLIMIT 才能使用。

                Time Zone tz()

                預設情況下 InfluxDB 返回 UTC+0 時間,可以在 SELECT 語句的末尾加上 tz('時區') ,使其將 time 的時區進行轉換。
                • 時間格式必須採用 RFC3339 format 才會進行轉換。

                參考