说到 in 关键字,小伙伴们肯定再熟悉不过了,它可是关系型数据库查询语句中的常用关键字。例:
select * from user where user_name in ('张三','李四','王五');
如果在时序数据库中,也遇到了 in 的使用场景,这该怎么办?尝试过的小伙伴都知道,在时序数据库是无法使用 in 关键字的,虽然它还是保留字。那么,只能寻找其他替代方案了,现在就来说说其他的替代方案。1. 针对单个tag的多条件匹配,可以使用正则表达式;
示例:
select * from measurement_name where tagName =~/^张三|王五$/;
执行语句:
select * from mtest where companyId='001' and deviceId =~/^001|002$/;
注意事项:
-
正则表达式里不需要加引号;
-
该用法只支持tag,如果换成field不可以。
-
顺便温习一下正则表达式中各个符号的含义:
// 正则表达式主体被包含双斜杠中;
^ 匹配输入字符串开始的位置;
| 代表或,指明多项之间的一个选择;
$ 匹配输入字符串结束的位置。
有小伙伴说:我的查询语句可不只是一个字段的多个条件那么简单,我还需要按照时间降序排序,取每个tag的第一条记录,也就是最新记录。
难度升级了,这就是我们要说的第二个问题,分组 + 排序 + 最新的一条记录;还拿上面的数据为例,我们要查出companyId下的所有设备的最新采集数据。
2. 分组 + 排序 + 最新记录; 示例:
select * from measurement_name where tagName =~/^张三|王五$/ group by tagName order by time desc limit 1;
执行语句:
select * from mtest where companyId='001' and deviceId =~/^001|002$/ group by deviceId order by time desc limit 1;
还有同学说:我的查询语句不是一个字段的多个条件,是多个字段的多个条件,而且还涉及到分组 + 排序。还拿上面的数据为例,我们要查出所有公司下的所有设备的最新采集数据。
3. 多个tag分组 + 排序 + 最新的一条记录;示例:
select * from measurement_name group by tagName, tagName1 order by time desc limit 1;
执行语句:
select * from mtest group by companyId,deviceId order by time desc limit 1;
4. 多条件 + 分组 + 排序 + 最新的一条记录;
示例1:
select * from measurement_name ((tagName=tagValue and tagName=~/^张三|王五$/ ) or (tagName=tagValue and tagName=~/^张三|王五$/ )) group by tagName, tagName1 order by time desc limit 1;
执行语句:
select * from mtest where ((companyId='001' and deviceId =~/^001|002$/ ) or (companyId='002' and deviceId =~/^003|002$/ )) group by companyId,deviceId order by time desc limit 1;
示例2:
select *,tagName,tagName1 from measurement_name ((tagName=tagValue and tagName=~/^张三|王五/ ) or (tagName=tagValue and tagName=~/^张三|王五$/ )) group by tagName, tagName1 order by time desc limit 1;
执行语句:
select *, companyId,deviceId from mtest where ((companyId='001' and deviceId =~/^001|002$/ ) or (companyId='002' and deviceId =~/^003|002$/ )) group by companyId,deviceId order by time desc limit 1;
最后有同学说,我要查询的数据,在两个表都有数据,那该怎么办?能联合查询吗?
5.多表查询
执行语句:
select *, companyId,deviceId from mtest,mtest1 where companyId='002' and deviceId =~/^001|002$/ group by deviceId order by time desc limit 1;
最后总结
上面的这些用法,主要解决在循环中查询时序数据库的问题。在循环中查询数据库,是性能大忌,循环10000次,访问数据库10000次,这其中的开销就不多说了。能一个Sql语句就能解决的问题,就一个sql语句解决吧!
当然第四种用法, or 的使用,能 or 多少条件,也是有限制的,如果 or上一百多个条件,又会带来性能问题,查询很慢,具体还是看实际q情况吧。
刻意练习只能入门,持续行动才能精进~!
让我们在实战中越战越勇,越战越强~!
初次使用时序数据库InfluxDB,安装、简单的命令及详解配置
新手上路,时序数据库InfluxDB命令总是报错,这篇文章不容错过!
SpringBoot2.0快速整合InfluxDB,新增、批量新增,通过反射机制构建查询结果,简单易懂,拿来即用
Linux CentOS 7.X 时序数据库InfluxDB的安装及简单使用
欢迎关注同名公众号~!
网友评论