influxdb基础(七)——select查询基础语法(类sql,细节与踩坑总结)

一、前言

influxdb的查询语法在基本组成上和mysql非常相似,都有基本的select … from …group byorder bylimit、聚合函数等,在一定程度上降低了influxdb的学习门槛。但是也有很多细节需要注意,比如:

  1. group by后面只能对tagstime分组。
  2. order by 只能对time进行排序。
  3. 聚合函数只能作用于fields
  4. limit语法也不太一样。

友情提示:篇幅冗长,所有的细节可直接看总结就完事了!

二、导入官方示例数据

inflxudb官方提供了示例数据供使用者模拟查询。

1、首先将示例数据下载到机器本地:

# 将示例数据下载到某个地方
curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt

2、导入数据

# 如果influx 设置了权限验证,需要加上 -username和-password。
# NOAA_data.txt中已包含创建数据库NOAA_water_database的语句。
influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database

三、SELECT基本语法

SELECT field keys [time | tag kyes | * ]  FROM measurements WHERE conditions GROUP BY [tag keys | time] ORDER BY time [asc | desc] LIMIT number [OFFSET number]  
  • SELECT后面查询显示字段必须至少有一个field key,否则会抛异常ERR: at least 1 non-time field must be queried。还可显示tag keystime,或者*显示所有字段。
  • FROM查询数据来源一个或者多个measurement
  • WHERE查询条件可为tag keystimefield keys 也可作为查询条件但是不常用,因为不是索引,查询效率比较低。tag keys条件操作符支持=、!=、<>、正则field keys支持=、!=、<>、>、>=、<、<=、正则
  • GROUP BY只能对tag keystime进行合分组,可以多字段排序,如group by tag1,tag2,time,也可一个*对所有的tag进行分组聚合(不包括time)。
  • ORDER BY只能对time进行排序,asc升序,desc降序。
  • LIMIT分页,LIMIT后面的数字是查询显示多少条,OFFSET后面数字代表偏移量(从0开始代表第一条),如limit 10 offset 10意思为从第11条开始往后10条。

1、简单查询示例数据

现在开始简单查询之前导入的示例数据:
在这里插入图片描述

(1)查询average_temperature的数据。

# 因为数据量比较大,配合limit防止返回大量数据。
select * from average_temperature limit 2

在这里插入图片描述
(2)查询average_temperaturelocationcoyote_creek的数据,字段只显示timedegrees

select time, degrees from average_temperature where location='coyote_creek' limit 2

在这里插入图片描述

上面的数据显示格式是column,且时间是时间戳,前面的文章也介绍过,可执行如下指令进行设置:

# 输入json格式
format json
# 让json格式输出更好看
pretty
# 格式化时间显示
precision rfc3339

在这里插入图片描述

2、没有in还有or

where后面没有in来范围查询,但是有or也可以做到异曲同工之妙。

select * from h2o_pH where location='coyote_creek' or location='santa_monica' limit 4

3、模糊查询

tag keysfield keys都支持正则,可通过如下正则达到模糊查询的效果。

# location名称中包含coyote的数据
select * from h2o_quality where location=~/.*coyote.*/ limit 10

4、group by

(1)group by tag

location分组查询,返回结果是一个大results对象结果集内包含两个series,第一个serieslocationcoyote_creek的聚合结果集,第二个serieslocationsanta_monica的聚合结果集。

select * from h2o_pH group by location limit 2
# 查询结果显示
{
    "results": [
        {
            "series": [
                {
                    "name": "h2o_pH",
                    "tags": {
                        "location": "coyote_creek"
                    },
                    "columns": [
                        "time",
                        "pH"
                    ],
                    "values": [
                        [
                            "2019-08-17T00:00:00Z",
                            7
                        ],
                        [
                            "2019-08-17T00:06:00Z",
                            8
                        ]
                    ]
                }
            ]
        },
        {
            "series": [
                {
                    "name": "h2o_pH",
                    "tags": {
                        "location": "santa_monica"
                    },
                    "columns": [
                        "time",
                        "pH"
                    ],
                    "values": [
                        [
                            "2019-08-17T00:00:00Z",
                            6
                        ],
                        [
                            "2019-08-17T00:06:00Z",
                            6
                        ]
                    ]
                }
            ]
        }
    ]
}

(2)group by time(1m)

time分组时并不是简单的group by timetime后面还需要加一个分组聚合的持续时间,如group by time(1m)。支持的持续时间单位有:

单位备注
u or µmicroseconds (1 millionth of a second)
msmilliseconds (1 thousandth of a second)
ssecond
mminute
hhour
dday
wweek

time进行分组,查询结果必须对field使用聚合函数,如count()sum()max()min()等。

select sum(pH) from h2o_pH  group by time(1m) limit 4
# 查询结果显示
{
    "results": [
        {
            "series": [
                {
                    "name": "h2o_pH",
                    "columns": [
                        "time",
                        "sum"
                    ],
                    "values": [
                        [
                            "2019-08-17T08:00:00+08:00",
                            13
                        ],
                        [
                            "2019-08-17T08:01:00+08:00",
                            null
                        ]
                    ]
                }
            ]
        }
    ]
}

由于Influxdb 时区默认是UTC,若以一天进行数据聚合,需要加上便宜量 -8h 进行聚合:

select sum(pH) from h2o_pH  group by time(1d,-8h) fill(0) limit 4

(3)fill(0)填充null

可以看到values结果集中有null的情况,可在查询语句中加fill(0),遇到null0来填充。fill()中只能填数字。

5、order by

order by 只能对time进行排序,asc升序,desc降序。

select sum(pH) from h2o_pH  group by time(1m) fill(0) order by time asc limit 2

6、limit和slimit

limit可单独使用,也可配合offset使用,offset偏移量的意思。

select sum(pH) from h2o_pH  group by time(1h) fill(0) order by time asc limit 2 offset 10

select进行多个tag分组后,会返回多个series,可使用slmit限制series返回的个数。slimit不像limit有偏移量offset,但是可以配合limit一起使用:

# 查询显示 前两个series,且每个series里显示2条数据,偏移量10
select * from h2o_quality group by * limit 2 offset 10 slimit 2

7、from多表查询

多表查询,以时间进行连接,不存在的值用null填充。一般情况连接的两张表tag和field上有一定的联系和比较,毫不相干的两表连接查询没什么价值。

select * from h2o_feet,h2o_pH limit 1
{
    "results": [
        {
            "series": [
                {
                    "name": "h2o_feet",
                    "columns": [
                        "time",
                        "level description",
                        "location",
                        "pH",
                        "water_level"
                    ],
                    "values": [
                        [
                            "2019-08-17T00:00:00Z",
                            "below 3 feet",
                            "santa_monica",
                            null,
                            2.064
                        ]
                    ]
                }
            ]
        },
        {
            "series": [
                {
                    "name": "h2o_pH",
                    "columns": [
                        "time",
                        "level description",
                        "location",
                        "pH",
                        "water_level"
                    ],
                    "values": [
                        [
                            "2019-08-17T00:00:00Z",
                            null,
                            "coyote_creek",
                            7,
                            null
                        ]
                    ]
                }
            ]
        }
    ]
}

四、inflxudb保留字

在创建databasemeasurements以及tag keysfield keys时,尽量避开inflxudb的保留关键字,否则需要在select和insert语法上对保留字加英文双引号。

ALL           ALTER         ANALYZE       ANY           AS            ASC
BEGIN         BY            CREATE        CONTINUOUS    DATABASE      DATABASES
DEFAULT       DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT
DROP          DURATION      END           EVERY         EXPLAIN       FIELD
FOR           FROM          GRANT         GRANTS        GROUP         GROUPS
IN            INF           INSERT        INTO          KEY           KEYS
KILL          LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME
OFFSET        ON            ORDER         PASSWORD      POLICY        POLICIES
PRIVILEGES    QUERIES       QUERY         READ          REPLICATION   RESAMPLE
RETENTION     REVOKE        SELECT        SERIES        SET           SHARD
SHARDS        SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS
TAG           TO            USER          USERS         VALUES        WHERE
WITH          WRITE

例如inflxudb有一个内部数据库_internal,专门用来记录统计influxdb运作数据的。
在这里插入图片描述
查询shardwrite表时,必须将其用英文双引号括起来。
在这里插入图片描述

五、总结

  1. select后面显示的字段必须至少包含一个field key
  2. select没有in但是有or代替效果。
  3. 模糊查询可使用正则~/.*xxx.*/,xxx为需要模糊匹配的字符串。
  4. group by 只能对tag keystime分组,group by * 对所有tag keys分组,不包括time
  5. group by 对time分组聚合,需要注意两点,查询结果需要对field使用聚合函数,time后面需要加分组聚合的持续时间,完整语法如:select sum(field) from measurements group by time(1m)
  6. group by tag, time(1m)不管tag和time顺序如何,都是先对tag进行分组聚合,然后对每个series进行time分组聚合。
  7. 分组聚合后难免有某个时间点的数据为null,可用fill(0)进行替换填充。
  8. order by只能对time排序。
  9. limit offset可实现分页效果,limit n offset m,偏移量m ,代表从m+1行开始返回n条数据。
  10. slimit限制分组聚合series返回个数,可配合limit使用,如 limit 2 offset 10 slimit 2,表示只返回两个series,每个series返回2条数据,偏移量为10。(在位置上slimit必须在limit后面)
  11. from后面跟多个measurements,达到多表连接查询的效果。
  12. 如若databasemeasurements以及tag keysfield keys中有influxdb的保留关键词,语法中需要用英文双引号括起来。但是还是尽量避免使用influxdb的保留关键词进行命名。

PS: 如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值