InfluxQL 是 SQL LIKE 語法,所以整體而言的語法很 SQL 沒有太大的區別,以下文件假定使用者了解SQL語法,因此只簡列出特別需要注意的部分。以下為目錄:
SELECT ... FROM ...WHEREFieldsTagsTimestampSELECT INTO GROUP BY tagstime()ORDER BY timeLIMIT and SLIMITLIMIT <N>SLIMIT <N>LIMIT <N1> SLIMIT <N2>OFFSET and SOFFSETOFFSET <N>SOFFSET <N>Time Zone tz()參考
SELECT ... FROM ...
用於從
FROM
指定的 measurement
,將 SELECT
的 fields
和 tags
顯示出來。SELECT *
表示返回所有的field_key
tag_key
。
- 當需要
SELECT tag_key
時,至少需要包含一個field_key
,否則不會返回任何結果,這是有關於數據儲存方式的結果。
SELECT "<field_key>"::field,"<tag_key>"::tag
其中::[field | tag]
是用來區分擁有相同名稱的field_key
和tag_key
,當同名沒有指定::[field | tag]
時,預設會是顯示field key
範例:
SELECT
不可在使用聚合函數
時,包含非聚合函數
、field key
或tag key
。也就是相當於 MySQL 中 sql_mode 包含ONLY_FULL_GROUP_BY
的情況。
FROM <database_name>.<retention_policy_name>.<measurement_name>
可以使用此方式指定到特定database
和retention policy
的measurement
。
FROM <database_name>..<measurement_name>
此方式會指定到對應database
使用DEFAULT
RP 的measuremen
。
FROM <measurement_name>,<measurement_name>
會傳回多個measurement
的數據。
- 引號的規則和 line protocol 不同,規則如下:
'
用於String
和timestamp
values,請勿用於標識符(database names, retention policy names, user names, measurement names, tag keys, and field keys)。"
用於標識符,標識符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
,如下範例: - 將
test
DB 下autogen
RP 的資料寫入到copy_test
DB 下autogen
RP 。 - 反向引用語法
<:MEASUREMENT>
讓copy_test
DB 中measurement
名稱引用test
DB 中的名稱。請注意在執行前必須確保copy_test
DB 及autogen
RP 存在。 - 若語法中未包含
GROUP BY *
在新的measurement
中tag
會被轉為field
。 - 當移動大量數據時,建議在
WHERE
條件中加入時間條件分批寫入,避免系統內存不足。
- 經常用於採樣,將高精度的資料透過
function
和group 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 units
, time units
可參考以下表格:
time(time_interval,offset_interval)
: InfluxDB 根據offset_interval
調整時間邊界,並根據time_interval
對時間範圍進行分組。
offset_interval
的格式為 int(可以為負)
+ time units
。當未指定
offset_interval
時,InfluxDB會以預設的時間邊界開始分組。如下範例:fill(<fill_option>)
:選填,預設情況下當組別沒有資料時會返回NULL
,該選項用來改變當沒有資料時返回的結果。null
:包含該組別但值返回NULL
,此為默認值。numerical value
:返回該數值。linear
: 根據 linear interpolation 顯示值。none
:不顯示該組別。previous
:顯示前一個組別的結果。
fill_option
有以下值-ORDER BY time
將結果按照時間排序。
- 預設使用
ASC
排序
- 在 influxQL 中只能用
time
排序
LIMIT and SLIMIT
LIMIT <N>
LIMIT <N>
返回前 N
個 Points
。SLIMIT <N>
SLIMIT <N>
返回前 N
個 Series
的所有 Points
,注意必須要搭配 GROUP BY
才能使用。LIMIT <N1> SLIMIT <N2>
返回
N2
個 Series
,每個 Series
返回 N1
個 Points
OFFSET and SOFFSET
OFFSET <N>
返回資料時,跳過前面
N
筆 Points
SOFFSET <N>
返回資料時,跳過前面
N
個 Series
,注意必須要搭配 GROUP BY
和 SLIMIT
才能使用。Time Zone tz()
預設情況下 InfluxDB 返回 UTC+0 時間,可以在
SELECT
語句的末尾加上 tz('時區')
,使其將 time 的時區進行轉換。- 時間格式必須採用
RFC3339 format
才會進行轉換。
<time_zone>
可參考 List of tz database time zones(WIKI) 。