InfluxDB时序数据库的安装使用教程3(InfluxQL查询语言详解)

三、InfluxQL 查询语言详解

1,基本查询

(1)从单个 measurement 查询所有的 field 和 tag:
注意:machine 和 type 是 tag,external 和 internal 是 fieldSELECT * FROM "temperature"

(2)从单个 measurement 中查询特定 tag 和 field:
提示:通过指定标识符的类型,可以区分具有相同名称的 field key 和 tag key。
SELECT "machine"::tag, "external"::field, "internal"::field FROM "temperature"

(3)从单个 measurement 中选择特定的 tag 和 field,并提供其标识符类型

提示:通过指定标识符的类型,可以区分具有相同名称的 field key 和 tag key。

SELECT "machine"::tag, "external"::field, "internal"::field FROM "temperature"

(4)从单个 measurement 查询所有 field:

SELECT *::field FROM "temperature"

(5)从 measurement 中选择一个特定的 field 并执行基本计算:

SELECT ("temperature" * 2) + 4 FROM "temperature"

2,FROM 子句

(1)从多个 measurement 中查询数据:
SELECT * FROM "temperature","temperature2"

(2)一个完全指定的 measurement(<database_name>.<retention_policy_name>.<measurement_name>)中返回数据,这个完全指定是指指定了数据库和存储策略:

SELECT * FROM "mydb"."autogen"."temperature"

(3)从特定数据库中查询 measurement 的所有数据(跟上面完全指定相比,少了存储策略):

SELECT * FROM "mydb".."temperature"

3,WHERE 子句

(1)WHERE 子句支持 field value 是字符串,布尔型,浮点数和整数这些类型,其中字段值如果是字符串的话需要用单引号引起来:
支持的操作符:
= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
// 查询有特定field的key value为字符串的数据
SELECT * FROM "temperature" WHERE "xxx" = '25'
 
// 查询有特定field的key value并且带计算的数据
SELECT * FROM "temperature" WHERE "external" + 2 > 1

(2)而 tag value 只能是字符串,因此需要用单引号来把 tag value 引起来:

支持的操作符:
= 等于
<> 不等于
!= 不等于

(3)还可以根据时间戳来过滤数据:

SELECT * FROM "temperature" WHERE time > now() - 7d
SELECT * FROM "temperature" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'

4,根据 Tag 进行 GROUP BY

(1)对单个 tag 作 group by:

SELECT SUM("internal") FROM "temperature" GROUP BY "type"

(2)对多个 tag 作 group by:

SELECT SUM("internal") FROM "temperature" GROUP BY "type", "machine"

(3)对所有 tag 作 group by:

SELECT SUM("internal") FROM "temperature" GROUP BY *

5,根据时间戳进行 GROUP BY

(1)GROUP BY time(time_interval) 返回结果按指定的时间间隔 group by:

// 时间间隔为30分钟并且还对tag key作group by
SELECT MAX("external") FROM "temperature" WHERE time >= '2020-08-01T20:00:00Z' AND time < '2020-08-02T00:00:00Z' GROUP BY time(30m),"type"

 

(2)GROUP BY time(time_interval, offset_interval) 与上面相比多了个 offset_interval 参数,offset_interval 是一个持续时间。它向前或向后移动 InfluxDB 的预设时间界限。offset_interval 可以为正或负。
// 时间间隔为30分钟并且还对tag key作group by,并将预设时间边界向前移动 25 分钟
SELECT MAX("external") FROM "temperature" WHERE time >= '2020-08-01T20:00:00Z' AND time < '2020-08-02T00:00:00Z' GROUP BY time(30m,15m),"type"

 

(3)fill(<fill_option>)是可选的,它会更改不含数据的时间间隔的返回值:
SELECT MAX("external") FROM "temperature" WHERE time >= '2020-08-01T20:00:00Z' AND time < '2020-08-02T00:00:00Z' GROUP BY time(30m) fill(0)

 

6,ORDER BY TIME DESC

(1)默认情况下,InfluxDB 以升序的顺序返回结果:返回的第一个点具有最早的时间戳,返回的最后一个点具有最新的时间戳。
(2)ORDER BY time DESC 反转该顺序,使得 InfluxDB 首先返回具有最新时间戳的点:

SELECT * FROM "temperature" ORDER BY time DESC

 

7,LIMIT 和 SLIMIT 子句

(1)LIMIT <N>:N 指定每次 measurement 返回的点数。如果 N 大于 measurement 的点数,InfluxDB 将从该测量中返回所有点。
// 限制返回的点数
SELECT * FROM "temperature" LIMIT 2

(2)SLIMIT <M>:M 指定从指定 measurement 返回的 series 数。如果 M 大于 measurement 中 series 联数,InfluxDB 将从该 measurement 中返回所有 series。

// 限制返回的series的数目
SELECT * FROM "temperature" SLIMIT 2

(3)LIMIT 和 SLIMIT 可以同时使用:

// 限制数据点数和series数并且包括一个GROUP BY time()子句
SELECT * FROM "temperature" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2 SLIMIT 1

8,OFFSET 和 SOFFSET子句

(1)OFFSET 中的 N 表示从查询结果的第 N 个点开始进行分页。
注意:OFFSET 必须和 LIMIT 搭配使用,如果只有 OFFSET 而没有 LIMIT,将会导致不一致的查询结果
// 从下标4开始的第5、6、7行总共3行显示了出来
SELECT * FROM "temperature" LIMIT 3 OFFSET 4

(2)SOFFSET 将从查询结果的第 N 个 series 开始进行分页。

SELECT count(external) FROM "temperature" GROUP BY * SLIMIT 1 SOFFSET 1

9,时间语法

(1)所有时间戳格式都支持基本算术。用表示时间精度的字符添加(+)或减去(-)一个时间。
注意:InfluxQL 需要 + 或 - 和表示时间精度的字符之间用空格隔开
// 对RFC3339格式的时间戳的基本计算
SELECT * FROM "temperature" WHERE time > '2021-12-04T03:04:00Z' + 6m
 
// 对epoch时间戳的基本计算
SELECT * FROM "temperature" WHERE time > 24043524m - 6m

(2)使用 now() 查询时间戳相对于服务器当前时间戳的的数据,同样也支持基本算术。

// 用相对时间指定时间间隔
SELECT * FROM "temperature" WHERE time > now() - 1h
 
// 用绝对和相对时间指定时间间隔
SELECT * FROM "temperature"  WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d

10,正则表达式

(1)正则表达式前后使用斜杠 /,并且使用 Golang 的正则表达式语法。支持如下操作符:
=~ 匹配
!~ 不匹配

(2)InluxDB 支持在以下场景使用正则表达式:

注意:目前,InfluxQL 不支持在 WHERE 中使用正则表达式去匹配不是字符串的 field value,以及数据库名和 retention policy。

SELECT 中的 field key 和 tag keyFROM 中的 measurement
在 WHERE 中的 tag value 和字符串类型的 field value
在 GROUP BY 中的 tag key

(3)下面一些使用正则表达式的样例:

注意:正则表达式比精确的字符串更加耗费计算资源; 具有正则表达式的查询比那些没有的性能要低一些。

// 在SELECT中使用正则表达式指定field key和tag key
SELECT /a/ FROM "temperature" LIMIT 1
 
//在FROM中使用正则表达式指定measurement
SELECT MEAN("internal") FROM /temperature/
 
// 在WHERE中使用正则表达式指定tag value
SELECT MEAN(internal) FROM "temperature" WHERE "machine" =~ /[u]/
 
// 在WHERE中使用正则表达式指定无值的tag
SELECT * FROM "temperature" WHERE "machine" !~ /./
 
// 在WHERE中使用正则表达式指定有值的tag
SELECT MEAN("internal") FROM "temperature" WHERE "machine" =~ /./

11,子查询

(1)子查询是嵌套在另一个查询的 FROM 子句中的查询。使用子查询将查询作为条件应用于其他查询。子查询提供与嵌套函数和 SQLHAVING 子句类似的功能。
子查询相关说明:
InfluxDB 首先执行子查询,再次执行主查询。
主查询围绕子查询,至少需要 SELECTFROM 子句。主查询支持本文档中列出的所有子句。
子查询显示在主查询的 FROM 子句中,它需要附加的括号。子查询支持本文档中列出的所有子句。
InfluxQL 每个主要查询支持多个嵌套子查询。

(2)下面是子查询样例:

// 计算多个`MAX()`值的`SUM()`
SELECT SUM("max") FROM (SELECT MAX("internal") FROM "temperature" GROUP BY "machine")
 
// 计算两个field的差值的`MEAN()`
SELECT MEAN("difference") FROM (SELECT "external" - "internal" AS "difference" FROM "temperature")
 
原文地址:https://www.cnblogs.com/shanheyongmu/p/15667086.html