返回 导航

其他

hangge.com

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

作者:hangge | 2020-09-23 08:10

三、InfluxQL 查询语言详解

1,基本查询

(1)从单个 measurement 查询所有的 fieldtag
注意machinetypetagexternalinternalfield
SELECT * FROM "temperature"

(2)从单个 measurement 中查询特定 tagfield
注意:我们可以只 SELECT field,但不能只 SELECT tag。也就是说 SELECT tag 时至少要 SELECT 一个 field
SELECT "machine", "external", "internal" FROM "temperature"

(3)从单个 measurement 中选择特定的 tagfield,并提供其标识符类型:
提示:通过指定标识符的类型,可以区分具有相同名称的 field keytag 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 引起来:
支持的操作符:
  • = 等于
  • <> 不等于
  • != 不等于
SELECT * FROM "temperature" WHERE "machine" != 'unit45'

(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)对单个 taggroup by
SELECT SUM("internal") FROM "temperature" GROUP BY "type"

(2)对多个 taggroup by
SELECT SUM("internal") FROM "temperature" GROUP BY "type", "machine"

(3)对所有 taggroup 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 大于 measurementseries 联数,InfluxDB 将从该 measurement 中返回所有 series
// 限制返回的series的数目
SELECT * FROM "temperature" SLIMIT 2

(3)LIMITSLIMIT 可以同时使用:
// 限制数据点数和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 开始进行分页。
注意SOFFSET 要跟 SLIMIT 子句一同搭配使用。如果只使用 SOFFSET 而没有 SLIMIT 子句,则可能会导致不一致的查询结果。
SELECT count(external) FROM "temperature" GROUP BY * SLIMIT 1 SOFFSET 1

9,时间语法

(1)所有时间戳格式都支持基本算术。用表示时间精度的字符添加(+)或减去(-)一个时间。
注意InfluxQL 需要 +- 和表示时间精度的字符之间用空格隔开。
// 对RFC3339格式的时间戳的基本计算
SELECT * FROM "temperature" WHERE time > '2015-09-18T21:24: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 keytag key
  • FROM 中的 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")
评论

全部评论(0)

回到顶部