InfluxDb中的数据查询语法where子句
公司用的时序性数据库是influxdb,但是确实接触有点少。
心里话: 就是没接触过,度娘教教我。。。。
我咋回呢,现学吧,都是数据库,天下乌鸦一般黑
然后就哟了以下:
本节讲解where子句,注意,查询语言是大小写无关的哈。
1、influxdb的where语法
SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> […]]
- 可以有多个条件表达式conditional_expression
- 条件表达式之间可以有AND和OR
2、语法描述
WHERE
子句后可以写写field,tag和timestamp。
conditional_expressions
.
3、where 子句中包含fields时
where子句语法:
field_key [‘string’ | boolean | float | integer]
WHERE
子句支持field value是字符串,布尔型,浮点数和整数这些类型。
在
WHERE
子句中单引号来表示字符串字段值。不加引号或者用双引号,不会返回结果,也不会返回错误。
支持的操作符operator如下:
=
等于<>
不等于!=
不等于>
大于>=
大于等于<
小于<=
小于等于
4、where 子句中包含tags时
tag_key [‘tag_value’]
WHERE
子句中的用单引号来把tag value引起来。具不加引号或者用双引号,不会返回结果,也不会返回错误。
支持的操作符:
=
等于<>
不等于!=
不等于
5、timestamps
对于大多数SELECT
语句,默认时间范围为UTC的1677-09-21 00:12:43.145224194
到2262-04-11T23:47:16.854775806Z
。 对于只有GROUP BY time()
子句的SELECT
语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194
和now()
之间。
6、Where语句的例子
6.1 例一:查询有特定field的key value的数据
use NOAA_water_database |
---|
SELECT * FROM “h2o_feet” WHERE “water_level” > 8 |
name: h2o_feet |
-------------- |
time level description location water_level |
2015-08-18T00:00:00Z between 6 and 9 feet coyote_creek 8.12 |
2015-08-18T00:06:00Z between 6 and 9 feet coyote_creek 8.005 |
[…] |
2015-09-18T00:12:00Z between 6 and 9 feet coyote_creek 8.189 |
2015-09-18T00:18:00Z between 6 and 9 feet coyote_creek 8.084 |
这个查询将会返回measurement为h2o_feet
,字段water_level
的值大于8的数据。
6.2 例二:查询有特定field的key value为字符串的数据
SELECT * FROM “h2o_feet” WHERE “level description” = ‘below 3 feet’ |
---|
name: h2o_feet |
-------------- |
time level description location water_level |
2015-08-18T00:00:00Z below 3 feet santa_monica 2.064 |
2015-08-18T00:06:00Z below 3 feet santa_monica 2.116 |
[…] |
2015-09-18T14:06:00Z below 3 feet santa_monica 2.999 |
2015-09-18T14:36:00Z below 3 feet santa_monica 2.907 |
运行例子
该查询从h2o_feet
返回数据,其中level description
等于below 3 feet
。InfluxQL在WHERE
子句中需要单引号来将字符串field value引起来。
field value用双引号是一种错误哦,不会返回数据哦:
6.3 例三:查询有特定field的key value并且带计算的数据
> SELECT * FROM “h2o_feet” WHERE “water_level” + 2 > 11.9 |
---|
name: h2o_feet |
-------------- |
time level description location water_level |
2015-08-29T07:06:00Z at or greater than 9 feet coyote_creek 9.902 |
2015-08-29T07:12:00Z at or greater than 9 feet coyote_creek 9.938 |
2015-08-29T07:18:00Z at or greater than 9 feet coyote_creek 9.957 |
2015-08-29T07:24:00Z at or greater than 9 feet coyote_creek 9.964 |
2015-08-29T07:30:00Z at or greater than 9 feet coyote_creek 9.954 |
2015-08-29T07:36:00Z at or greater than 9 feet coyote_creek 9.941 |
2015-08-29T07:42:00Z at or greater than 9 feet coyote_creek 9.925 |
2015-08-29T07:48:00Z at or greater than 9 feet coyote_creek 9.902 |
2015-09-02T23:30:00Z at or greater than 9 feet coyote_creek 9.902 |
运行例子
该查询从h2o_feet
返回数据,其字段值为water_level
加上2大于11.9。
6.4 例四:查询有特定tag的key value的数据
SELECT “water_level” FROM “h2o_feet” WHERE “location” = ‘santa_monica’ |
---|
name: h2o_feet |
-------------- |
time water_level |
2015-08-18T00:00:00Z 2.064 |
2015-08-18T00:06:00Z 2.116 |
[…] |
2015-09-18T21:36:00Z 5.066 |
2015-09-18T21:42:00Z 4.938 |
该查询从h2o_feet
返回数据,其中tag location
为santa_monica
。InfluxQL需要WHERE
子句中tag的过滤带单引号。
注意:时间无论你指定没有,都是会显示的。
6.5 例五:查询有特定tag的key value以及特定field的key value的数据
SELECT “water_level” FROM “h2o_feet” WHERE “location” <> ‘santa_monica’ AND (water_level < -0.59 OR water_level > 9.95) |
---|
name: h2o_feet |
-------------- |
time water_level |
2015-08-29T07:18:00Z 9.957 |
2015-08-29T07:24:00Z 9.964 |
2015-08-29T07:30:00Z 9.954 |
2015-08-29T14:30:00Z -0.61 |
2015-08-29T14:36:00Z -0.591 |
2015-08-30T15:18:00Z -0.594 |
该查询从h2o_feet
中返回数据,其中tag location
设置为santa_monica
,并且field water_level
的值小于-0.59或大于9.95。 WHERE
子句支持运算符AND
和OR
,并支持用括号分隔逻辑。
6.6 例六:根据时间戳来过滤数据
SELECT * FROM “h2o_feet” WHERE time > now() - 7d
该查询返回来自h2o_feet
,该measurement在过去七天内的数据。
你也许什么也查不出来,因为数据库的时间远远大于7天。减去500d,可能会有值。
7、WHERE子句常见的问题
7.1 问题一:WHERE子句返回结果为空
在大多数情况下,这个问题是tag value或field value缺少单引号的结果。具有无引号或双引号tag value或field value的查询将不会返回任何数据,并且在大多数情况下不会返回错误。
下面的代码块中的前两个查询尝试指定tag value为santa_monica
,没有任何引号和双引号。那些查询不会返回结果。 第三个查询单引号santa_monica
(这是支持的语法),并返回预期的结果。
SELECT “water_level” FROM “h2o_feet” WHERE “location” = santa_monica |
---|
> SELECT “water_level” FROM “h2o_feet” WHERE “location” = “santa_monica” |
> SELECT “water_level” FROM “h2o_feet” WHERE “location” = ‘santa_monica’ |
name: h2o_feet |
-------------- |
time water_level |
2015-08-18T00:00:00Z 2.064 |
[…] |
2015-09-18T21:42:00Z 4.938 |
下面的代码块中的前两个查询尝试指定field字符串为at or greater than 9 feet
,没有任何引号和双引号。第一个查询返回错误,因为field字符串包含空格。 第二个查询不返回结果。 第三个查询单引号at or greater than 9 feet
(这是支持的语法),并返回预期结果。
> SELECT “level description” FROM “h2o_feet” WHERE “level description” = at or greater than 9 feet |
---|
ERR: error parsing query: found than, expected ; at line 1, char 86 |
> SELECT “level description” FROM “h2o_feet” WHERE “level description” = “at or greater than 9 feet” |
> SELECT “level description” FROM “h2o_feet” WHERE “level description” = ‘at or greater than 9 feet’ |
name: h2o_feet |
-------------- |
time level description |
2015-08-26T04:00:00Z at or greater than 9 feet |
[…] |
2015-09-15T22:42:00Z at or greater than 9 feet |