Influx Sql系列教程九:query数据查询基本篇二
前面一篇介绍了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中的页和条数
II. 其他
0. 系列博文
- 190813-Influx Sql系列教程八:query数据查询基本篇
- 190730-Influx Sql系列教程七:delete 删除数据
- 190729-Influx Sql系列教程六:insert 修改数据
- 190726-Influx Sql系列教程五:insert 添加数据
- 190723-Influx Sql系列教程四:series/point/tag/field
- 190721-Influx Sql系列教程三:measurement 表
- 190719-Influx Sql系列教程二:retention policy 保存策略
- 190718-Influx Sql系列教程一:database 数据库
- 190717-Influx Sql系列教程零:安装及influx-cli使用姿势介绍
- 190509-InfluxDb之时间戳显示为日期格式
- 190506-InfluxDB之配置修改
- 190505-InfluxDB之权限管理
- 180727-时序数据库InfluxDB之备份和恢复策略
- 180726-InfluxDB基本概念小结
- 180725-InfluxDB-v1.6.0安装和简单使用小结
参考博文
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
Influx Sql系列教程九:query数据查询基本篇二的更多相关文章
- Influx Sql系列教程八:query数据查询基本篇
前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 ...
- Influx Sql系列教程七:delete 删除数据
前面介绍了使用insert实现新增和修改记录的使用姿势,接下来我们看一下另外一个简单的使用方式,如何删除数据 1. delete 语句 delete的官方语法如下 DELETE FROM <me ...
- Influx Sql系列教程六:insert 修改数据
在influxdb中没有专门的修改数据的update语句,对于influxdb而言,如果想修改数据,还是得使用我们前面的说到的insert来实现,那么怎么判断一条insert语句是插入还是修改呢? 1 ...
- Influx Sql系列教程五:insert 添加数据
接下来开始进入influxdb的curd篇,首先我们看一下如何添加数据,也就是insert的使用姿势 在进入本篇之前,对于不了解什么是retention policy, tag, field的同学,有 ...
- Influx Sql系列教程四:series/point/tag/field
influxdb中的一条记录point,主要可以分为三类,必须存在的time(时间),string类型的tag,以及其他成员field:而series则是一个measurement中保存策略和tag集 ...
- Influx Sql系列教程三:measurement 表
在influxdb中measurement相当于mysql中的表,可以理解为一条一条记录都是存与measurent中的,一个数据库中可以有多个measurement,一个measurement中可以存 ...
- Influx Sql系列教程二:retention policy 保存策略
retention policy这个东西相比较于传统的关系型数据库(比如mysql)而言,是一个比较新的东西,在将表之前,有必要来看一下保存策略有什么用,以及可以怎么用 I. 基本操作 1. 创建re ...
- Influx Sql系列教程零:安装及influx-cli使用姿势介绍
influxdb 时序数据库,因为实际业务中使用到了,然而并没有发现有特别好的文章,完整的介绍influx sql的使用姿势,因此记录下实际开发中学习的体会,主要参考来自于官方文档 Influx Qu ...
- SQL系列(九)—— 子查询(subQuery)
1.子查询 前面的系列介绍的都是简单的查询场景,其中都只涉及到单张表的数据检索.但是在日常是实际应用中,数据模型之间的关系都非常的复杂,数据的需求一般都是来源于多个数据模型之间的组合而成,即对应多张表 ...
随机推荐
- 3、Python的IDE之Jupyter的使用
一.Jupyter介绍 Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown.用途包括:数据清理和转换,数 ...
- Vue --- 组件练习
一 ad_data = { tv: [ {img: 'img/tv/001.png', title: 'tv1'}, {img: 'img/tv/002.png', title: 'tv2'}, {i ...
- janusgraph-图数据库的学习(1)
图数据库的简介-来源百度百科 1.简介 图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息.图形数据库是一种非关系型数据库,它应用图形理论存储实体之间的关系信息.最常见例子就 ...
- apache commons-configuration包读取配置文件
1.pom依赖添加 <!-- 配置文件读取 --> <dependency> <groupId>commons-configuration</groupId& ...
- 从TEB到PEB再到SEH(一)
什么是TEB? TEB(Thread Environment Block,线程环境块) 线程环境块中存放着进程中所有线程的各种信息 这里我们了解到了TEB即为线程环境块, 进程中每一条线程都对应着的自 ...
- render函数、createElement函数与vm.$slots
1.render函数.createElement函数 Vue.component('es-header', { render: function (createElement) { return cr ...
- c语言博客作业03--循环结构
0.展示PTA总分 1.本章学习总结 1.1学习内容总结 循环语句 for语句: for( 表达式1; 表达式2; 表达式3 ) { // 需要执行的语句; } 其执行过程是:表达式 1 首先执行且只 ...
- C#访问https地址实例
程序访问的网址从http换成了https,安全性更高了,程序对网址的访问也要改一下 C#访问https地址实例如下 namespace ConsoleApp2 { public class Progr ...
- Pyton项目打包成exe文件
Python项目打包成exe文件 1 系统环境 windows版本: Win7 64位 python环境:Anaconda python版本:3.6 64位 pyinstaller版本:3.5 1 安 ...
- 微信小程序 Flex局部元素被挤压问题
关于Flex布局不在此处赘述,需要了解的可以查阅官方文档:基本的布局方法——Flex布局 当使用Flex布局,想实现如下图1的效果时,代码编写如下: 图1: <!-- wxml文件 --> ...