各位童鞋大家好,咱们又相遇了,今天讲解基础sql第八篇,继续select查询语句。
相信大家都写过,用过分组查询吧。还是以oracle为例,如下语句
select age, count(1) from mytable where age > 18 group by age having count(1) > 1
这是一个常用的分组语句,统计出大于18岁的每个年龄的总人数。
还记得在我们初次学习的时候,老师应该就教导过‘分组统计’吧。group by 作为分组语句关键词,select 后的字段是需要和group by后的字段保持一致的。select 后的字段如果没出现在group by 语句中就会报错。但是 group by语句中的字段没出现在 select 语句中是可以的。分组如果不涉及到统计聚合的话在实际业务中的意义应该不会太多。因为单一分组查询只是查出某个字段或者组合字段的唯一值,也就是去重.但是去重的方法还可以用 distinct。大家在实际工作中如果涉及到分组的业务就可以考虑使用group by。
group by 的使用有个小问题,也是作者初期常出错的一个问题。就是 where 和having 的位置问题。where 是需要在 group by 的左边,having count 需要在group by 的右边哦。大家只要记住分组都是分组过滤之后的数据,要先把数据过滤好我们需要的数据,然后再进行分组才有意义,对吧。
分组还有一种形式。设想这样一个业务场景:
随着企业不断发展,每个时间段企业都会受到监管的定期评级,评级可能变好,变差或者维持不变。这个时候如果需要统计某一个时间段内评级为B的天数。该如何处理呢!
假设有张表rate_table.里面只存有 企业名称 (name), 企业评级(rate),评级日期(rate_date)。我们的需求是要统计3月20号到4月20号这个时间段评级为B的天数。是不是需要考虑3种情况,一种是3/20到4/20时间段内评级更新的情况,一种是3/20之前最后一次更新的情况,一种是4/20后最早的一次更新情况(该例中实际不用考虑这一情况,但是部分其它需求还是需要的)。要实现这