????????InfluxQL(Influx Query Language)是與InfluxDB緊密集成的一種SQL風格的語言,專為處理時間序列數據而設計。其基本語法結構清晰,方便開發者理解和實現。以下是對InfluxQL基本語法及常用聚合函數的簡單介紹:
目錄
一、基本語法
1. 基本概念
2. 數據類型
3. 基本操作
3.1 數據庫操作
3.2 數據寫入
3.2.1. 通過HTTP API寫入數據
3.2.2. 通過InfluxDB CLI寫入數據
3.3 數據查詢
4. 示例查詢
示例1:查詢指定Measurement中的所有數據
示例2:查詢指定Tag的數據并計算平均溫度
5. 注意事項
二 、聚合函數? ? ? ?
1.?COUNT()
2.?MEAN()
3.?MEDIAN()
4.?MODE()
5.?SUM()
6.?STDDEV()
7.?SPREAD()
一、基本語法
1. 基本概念
- Measurement(測量):在InfluxDB中,Measurement類似于傳統關系型數據庫中的表(Table),是數據的主要容器。
- Tag(標簽):用于索引的元數據,以鍵值對(key-value)的形式存在,其中key和value都是字符串類型。
- Field(字段):存儲實際的數據值,也以鍵值對的形式存在,但value可以是多種數據類型(如float、integer、string、boolean)。
- Point(點):由時間戳(Time)、一組Fields和一組Tags組成,是InfluxDB中存儲數據的基本單位。
2. 數據類型
InfluxQL支持的基本數據類型包括:
- float:浮點型,默認的數據類型。
- integer:整型,在插入數據時需要在數值后加
i
來指定。 - string:字符串,需要用雙引號將值括起來。
- boolean:布爾型,可以用
t
、T
、true
、True
、TRUE
表示真,用f
、F
、false
、False
、FALSE
表示假。
3. 基本操作
3.1 數據庫操作
- 顯示所有數據庫:
SHOW DATABASES
- 使用數據庫:
USE <database_name>
- 創建數據庫:
CREATE DATABASE <database_name>
- 刪除數據庫:
DROP DATABASE <database_name>
3.2 數據寫入
數據通過HTTP API或InfluxDB的命令行界面(CLI)寫入。寫入數據時,需要指定Measurement、Tags和Fields。
3.2.1. 通過HTTP API寫入數據
在使用HTTP API寫入數據時,你通常會發送一個POST請求到InfluxDB的/write
端點(注意:在新版本的InfluxDB中,如InfluxDB 2.x,API和寫入方式可能有所不同,但這里以InfluxDB 1.x為例)。請求體中包含了你要寫入的數據,這些數據按照特定的格式組織,包括Measurement、Tags和Fields。
示例:
假設我們有一個名為weather
的Measurement,我們想要記錄某個城市(如location=us-midwest
)的溫度(temperature
)和濕度(humidity
)。
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'weather,location=us-midwest temperature=82.3,humidity=54.1'
在這個例子中:
curl
是發送HTTP請求的工具。-i
選項表示包含HTTP響應頭。-XPOST
指定了請求類型為POST。'http://localhost:8086/write?db=mydb'
是InfluxDB的寫入URL,其中db=mydb
參數指定了數據將被寫入哪個數據庫(在這個例子中是mydb
)。--data-binary
后面的字符串是你要寫入的數據,它遵循Measurement,TagSet FieldSet
的格式。在這個例子中,weather
是Measurement,location=us-midwest
是TagSet(只有一個Tag),而temperature=82.3,humidity=54.1
是FieldSet(包含兩個Field)。
3.2.2. 通過InfluxDB CLI寫入數據
使用InfluxDB的命令行界面(CLI)寫入數據也很直接。首先,你需要登錄到CLI,然后使用INSERT
語句(注意:在InfluxDB 1.x中,實際上并沒有INSERT
這個關鍵詞,而是直接寫數據點,但在概念上可以理解為插入操作)。
示例:
# 假設你已經登錄到InfluxDB CLI,并且選擇了正確的數據庫
> weather,location=us-midwest temperature=78.9,humidity=67.2 1622547201000000000
在這個例子中:
>
是CLI的提示符。weather,location=us-midwest temperature=78.9,humidity=67.2
部分與HTTP API示例中的類似,指定了Measurement、Tags和Fields。1622547201000000000
是一個時間戳(以納秒為單位,這是InfluxDB內部使用的時間精度),它指定了數據點的時間。如果你不提供時間戳,InfluxDB將使用服務器當前的時間。
注意:
????????CLI和HTTP API在格式和細節上可能有所不同,但基本概念是相似的:我們都需要指定Measurement、Tags和Fields來寫入數據。在InfluxDB 2.x中,寫入數據的API和語法有所變化,但核心思想仍然相同。
3.3 數據查詢
- 基本查詢:使用
SELECT
語句從Measurement中選擇數據,可以指定Tags和Fields進行篩選。 - 時間范圍查詢:通過
WHERE
子句中的時間條件來限制查詢的時間范圍。 - 分組和聚合:使用
GROUP BY
子句對數據進行分組,并使用聚合函數(如COUNT()
、MEAN()
、SUM()
等)計算每個分組的統計量。 - 排序和限制:通過
ORDER BY
子句對查詢結果進行排序,使用LIMIT
和OFFSET
子句限制返回的數據點數量或進行分頁。
4. 示例查詢
示例1:查詢指定Measurement中的所有數據
SELECT * FROM "air_quality"
示例2:查詢指定Tag的數據并計算平均溫度
SELECT MEAN("temperature") AS "avg_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1m)
這個查詢會返回air_quality
?Measurement中,location
為city_a
且時間戳在過去一小時內的每分鐘平均溫度。
5. 注意事項
- 在InfluxQL中,時間戳是默認的索引列,且會自動生成,無需用戶指定。
- InfluxDB中的Measurement、Tags和Fields不需要事先創建,可以直接寫入數據。
- InfluxDB不存儲null值,如果某個數據點缺失某個字段的值,則該字段在該數據點中不會出現。
二 、聚合函數? ? ? ?
????????InfluxQL 提供了多種聚合函數,用于對時間序列數據進行聚合計算。
????????這些聚合函數允許我們根據時間間隔(如每分鐘、每小時等)對數據進行分組,并計算每個時間間隔內的統計量。以下是一些常用的 InfluxQL 聚合函數及其使用示例:
1.?COUNT()
計算指定時間間隔內的數據點數量。
示例:計算?air_quality
?measurement 中?location
?為?city_a
?的最近一小時內的數據點數量。
SELECT COUNT("temperature") AS "count"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1m)
注意:如果不需要按時間分組,可以去掉?GROUP BY time(1m)
。
2.?MEAN()
計算指定時間間隔內數值的平均值。
示例:計算?air_quality
?measurement 中?location
?為?city_a
?的最近一小時內的平均溫度。
SELECT MEAN("temperature") AS "avg_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
3.?MEDIAN()
計算指定時間間隔內數值的中位數。
示例:計算?air_quality
?measurement 中?location
?為?city_a
?的最近一小時內的溫度中位數。
SELECT MEDIAN("temperature") AS "median_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1h) -- 按小時分組,或根據需要調整
4.?MODE()
計算指定時間間隔內數值的眾數(InfluxDB 1.x 版本中可能不直接支持,這里假設為一個通用的SQL聚合函數概念)。
注意:InfluxDB 的官方文檔中可能不直接提供?MODE()
?函數,因為時間序列數據的眾數計算可能不如其他統計量常見。如果需要計算眾數,可能需要通過其他方式(如應用層邏輯)來實現。
5.?SUM()
計算指定時間間隔內數值的總和。
示例:計算?air_quality
?measurement 中?location
?為?city_a
?的最近一小時內的溫度總和。
SELECT SUM("temperature") AS "total_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1h) -- 按小時分組,或根據需要調整
6.?STDDEV()
計算指定時間間隔內數值的標準差。
示例:計算?air_quality
?measurement 中?location
?為?city_a
?的最近一小時內的溫度標準差。
SELECT STDDEV("temperature") AS "stddev_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1h) -- 按小時分組,或根據需要調整
7.?SPREAD()
計算指定時間間隔內數值的最大值和最小值之間的差值
注意:不是所有版本的InfluxDB都直接支持SPREAD()
,這里作為概念說明。
示例(假設使用類似?SPREAD()
?的邏輯,實際上可能需要手動計算):
SELECT MAX("temperature") - MIN("temperature") AS "spread_temperature"
FROM "air_quality"
WHERE "location" = 'city_a' AND time > now() - 1h
GROUP BY time(1h)
請注意,InfluxDB 的具體功能和支持的聚合函數可能會隨著版本的更新而發生變化。
因此,建議查閱我們所使用的 InfluxDB 版本的官方文檔以獲取最準確的信息。