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 版本的官方文档以获取最准确的信息。