Influx Sql系列教程九:query数据查询基本篇二

简介: 前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持

前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持


在开始本文之前,建议先阅读上篇博文: 190813-Influx Sql系列教程八:query数据查询基本篇


0. 数据准备



在开始查询之前,先看一下我们准备的数据,其中name,phone为tag, age,blog,id为field


> select * from yhh
name: yhh
time                age blog                 id name phone
----                --- ----                 -- ---- -----
1563889538654374538 26  http://blog.hhui.top 10 一灰灰
1563889547738266214 30  http://blog.hhui.top 11 一灰灰
1563889704754695002 30  http://blog.hhui.top 11 一灰灰2
1563889723440000821 30  http://blog.hhui.top 11 一灰灰3 110
> show tag keys from yhh
name: yhh
tagKey
------
name
phone
复制代码


1. 分组查询



和sql语法一样,influxdb sql的分组也是使用group by语句,其定义如下


SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
复制代码


a. group by tag


从上面的定义中,有一点需要特别强调,用来分组的必须是tag,也就是说对于influxdb而言,不支持根据field进行分组


一个实际的演示如下:

> select * from yhh group by phone
name: yhh
tags: phone=
time                age blog                 id name
----                --- ----                 -- ----
1563889538654374538 26  http://blog.hhui.top 10 一灰灰
1563889547738266214 30  http://blog.hhui.top 11 一灰灰
1563889704754695002 30  http://blog.hhui.top 11 一灰灰2
name: yhh
tags: phone=110
time                age blog                 id name
----                --- ----                 -- ----
1563889723440000821 30  http://blog.hhui.top 11 一灰灰3
复制代码


注意上面的输出结果,比较有意思,分成了两个结构段落,且可以输出完整的数据;而mysql的分组查询条件中一般需要带上分组key,然后实现一些数据上的聚合查询

如果我的分组中,使用field进行分组查询,会怎样?报错么?


> select * from yhh group by age
name: yhh
tags: age=
time                age blog                 id name phone
----                --- ----                 -- ---- -----
1563889538654374538 26  http://blog.hhui.top 10 一灰灰
1563889547738266214 30  http://blog.hhui.top 11 一灰灰
1563889704754695002 30  http://blog.hhui.top 11 一灰灰2
1563889723440000821 30  http://blog.hhui.top 11 一灰灰3 110
复制代码


从上面的case中可以看出,虽然执行了,但是返回的结果并不是我们预期的。


b. group by *


另外一个与一般SQL语法不一样的是group by 后面可以跟上*,表示根据所有的tag进行分组,一个测试如下


> select * from yhh group by *
name: yhh
tags: name=一灰灰, phone=
time                age blog                 id
----                --- ----                 --
1563889538654374538 26  http://blog.hhui.top 10
1563889547738266214 30  http://blog.hhui.top 11
name: yhh
tags: name=一灰灰2, phone=
time                age blog                 id
----                --- ----                 --
1563889704754695002 30  http://blog.hhui.top 11
name: yhh
tags: name=一灰灰3, phone=110
time                age blog                 id
----                --- ----                 --
1563889723440000821 30  http://blog.hhui.top 11
>
复制代码


c. group by time


除了上面的根据tag进行分组之外,还有一个更高级的特性,根据时间来分组,这个时间还支持一些简单的函数操作


定义如下

SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]
复制代码


我们知道influxdb的一个重要应用场景就是监控的记录,在监控面板上经常会有的就是根据时间进行聚合,比如查询某个服务每分钟的异常数,qps, rt等


下面给出一个简单的使用case

# 为了显示方便,将数据的时间戳改成日期方式展示
> precision rfc3339
> select * from yhh
name: yhh
time                           age blog                 id name phone
----                           --- ----                 -- ---- -----
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top 10 一灰灰
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top 11 一灰灰
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top 11 一灰灰2
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top 11 一灰灰3 110
> select count(*) from yhh where time>'2019-07-23T13:44:38.654374538Z' and time<'2019-07-23T13:50:43.440000821Z'  GROUP BY time(2m)
name: yhh
time                 count_age count_blog count_id
----                 --------- ---------- --------
2019-07-23T13:44:00Z 2         2          2
2019-07-23T13:46:00Z 0         0          0
2019-07-23T13:48:00Z 2         2          2
2019-07-23T13:50:00Z 0         0          0
复制代码


在上面的查询语句中,有几个地方需要说明一下


  • select后面跟上的是单个or多个field的聚合操作,根据时间进行分组时,不允许查询具体的field值,否则会有下面的错误提示
> select * from yhh where time>'2019-07-23T13:44:38.654374538Z' and time<'2019-07-23T13:50:43.440000821Z'  GROUP BY time(2m)
ERR: GROUP BY requires at least one aggregate function
复制代码


  • where条件限定查询的时间范围,否则会得到很多数据
  • group by time(2m) 表示每2分钟做一个分组, group by time(2s)则表示每2s做一个分组


2. 排序



在influxdb中排序,只支持针对time进行排序,其他的field,tag(因为是string类型,也没法排)是不能进行排序的


语法比较简单,如下,根据时间倒序/升序

order by time desc/asc
复制代码


一个简单的实例如下

# 根据非time进行排序时,直接报错
> select * from yhh order by age
ERR: error parsing query: only ORDER BY time supported at this time
# 根据时间进行倒排
> select * from yhh order by time desc
name: yhh
time                           age blog                 id name phone
----                           --- ----                 -- ---- -----
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top 11 一灰灰3 110
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top 11 一灰灰2
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top 11 一灰灰
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top 10 一灰灰
>
复制代码


3. 查询限制



我们常见的分页就是limit语句,我们常见的limit语句为 limit page, size,可以实现分页;然而在influxdb中则不同,limit后面只能跟上一个数字,表示限定查询的最多条数


a. limit


N指定每次measurement返回的point个数


SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>
复制代码


下满给出几个实际的case

> select * from yhh limit 2
name: yhh
time                           age blog                 id name phone
----                           --- ----                 -- ---- -----
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top 10 一灰灰
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top 11 一灰灰
# 分组之后,再限定查询条数
> select * from yhh group by "name" limit 1
name: yhh
tags: name=一灰灰
time                           age blog                 id phone
----                           --- ----                 -- -----
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top 10
name: yhh
tags: name=一灰灰2
time                           age blog                 id phone
----                           --- ----                 -- -----
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top 11
name: yhh
tags: name=一灰灰3
time                           age blog                 id phone
----                           --- ----                 -- -----
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top 11 110
复制代码


b. slimit


N指定从指定measurement返回的series数


SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>
复制代码


接下来演示下这个的使用姿势,首先准备插入几条数据,确保tag相同

> insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=14,id=14
> insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=15,id=15
> insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=16,id=16
> select * from yhh
name: yhh
time                           age blog                   id name phone
----                           --- ----                   -- ---- -----
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top   10 一灰灰
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top   11 一灰灰
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top   11 一灰灰2
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top   11 一灰灰3 110
2019-08-14T11:18:06.804162557Z 14  http://spring.hhui.top 14 一灰灰  110
2019-08-14T11:18:10.146588721Z 15  http://spring.hhui.top 15 一灰灰  110
2019-08-14T11:18:12.753413004Z 16  http://spring.hhui.top 16 一灰灰  110
> show series on test from yhh
key
---
yhh,name=一灰灰
yhh,name=一灰灰,phone=110
yhh,name=一灰灰2
yhh,name=一灰灰3,phone=110
复制代码


如下面的一个使用case

> select * from yhh group by * slimit 3
name: yhh
tags: name=一灰灰, phone=
time                           age blog                 id
----                           --- ----                 --
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top 10
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top 11
name: yhh
tags: name=一灰灰, phone=110
time                           age blog                   id
----                           --- ----                   --
2019-08-14T11:18:06.804162557Z 14  http://spring.hhui.top 14
2019-08-14T11:18:10.146588721Z 15  http://spring.hhui.top 15
2019-08-14T11:18:12.753413004Z 16  http://spring.hhui.top 16
name: yhh
tags: name=一灰灰2, phone=
time                           age blog                 id
----                           --- ----                 --
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top 11
name: yhh
tags: name=一灰灰3, phone=110
time                           age blog                 id
----                           --- ----                 --
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top 11
复制代码


说实话,这一块没看懂,根据官方的文档进行翻译的,没有get这个slimit的特点


4. 分页



上面只有point个数限制,但是分页怎么办?难道不支持么?


在influxdb中,有专门的offset来实现分页

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]
复制代码


简单来讲,就是limit 条数 offset 偏移


使用实例

> select * from yhh
name: yhh
time                           age blog                   id name phone
----                           --- ----                   -- ---- -----
2019-07-23T13:45:38.654374538Z 26  http://blog.hhui.top   10 一灰灰
2019-07-23T13:45:47.738266214Z 30  http://blog.hhui.top   11 一灰灰
2019-07-23T13:48:24.754695002Z 30  http://blog.hhui.top   11 一灰灰2
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top   11 一灰灰3 110
2019-08-14T11:18:06.804162557Z 14  http://spring.hhui.top 14 一灰灰  110
2019-08-14T11:18:10.146588721Z 15  http://spring.hhui.top 15 一灰灰  110
2019-08-14T11:18:12.753413004Z 16  http://spring.hhui.top 16 一灰灰  110
# 查询结果只有2条数据,从第三个开始(0开始计数)
> select * from yhh limit 2 offset 3
name: yhh
time                           age blog                   id name phone
----                           --- ----                   -- ---- -----
2019-07-23T13:48:43.440000821Z 30  http://blog.hhui.top   11 一灰灰3 110
2019-08-14T11:18:06.804162557Z 14  http://spring.hhui.top 14 一灰灰  110
> select * from yhh limit 2 offset 3
复制代码


5. 小结



本篇influxdb的查询篇主要介绍了sql中的三种常用case,分组,排序,分页;虽然使用姿势和我们常见的SQL大同小异,但是一些特殊点需要额外注意一下


  • 分组查询时,注意分组的key必须是time或者tag,分组查询可以返回完整的point
  • 排序,只支持根据时间进行排序,其他的字段都不支持
  • 分页,需要注意limit size offset startIndex和我们一般的使用case不同,它的两个参数分别表示查询的point个数,以及偏移量;而不是传统sql中的页和条数



相关文章
|
3月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
101 0
|
5月前
|
SQL Java 数据库连接
Apache Zeppelin系列教程第十篇——SQL Debug In Zeppelin
Apache Zeppelin系列教程第十篇——SQL Debug In Zeppelin
53 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
54 0
|
1月前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
105 6
|
4天前
|
SQL 存储 网络协议
SQL Server详细使用教程
SQL Server详细使用教程
26 2
|
5天前
|
SQL 存储 关系型数据库
SQL Server详细使用教程及常见问题解决
SQL Server详细使用教程及常见问题解决
|
12天前
|
SQL Oracle Java
SQL 注入神器:jSQL Injection 保姆级教程
SQL 注入神器:jSQL Injection 保姆级教程
|
18天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
14 0
|
3月前
|
SQL 网络协议 Java
【Java+SQL Server】前后端连接小白教程
【Java+SQL Server】前后端连接小白教程
26 0
|
5月前
|
SQL 分布式计算 Java
Spark 基础教程:wordcount+Spark SQL
Spark 基础教程:wordcount+Spark SQL
36 0