假设表为test,基本数据为a,b两列,均为数值型:
手动添加了以上数据:
基本语法:select a,sum(b) sum from test group by a having sum>5;
结果是:
解释为:通过a做分组,统计b的和,筛选出大于5的结果。
再简单一点呢??
select a from test group by a having sum(b)>5;
省略掉select部分的sum和命名操作,直接在having过程中使用函数,结果是省略了sum值,只保留了key,但结果是对的。
那么在省略一点,
select a from test having sum(b)>5;
这个结果可能就不是你想要的了,
再换换条件测试一下,
select a from test having sum(b)>1;
select a from test having sum(b)>25;
select a from test having sum(b)>26;
测试2个条件,发现在sum(b)>26的时候就或更大的时候数据为空,其他的时候都是1,
发现是因为全局的b的值做sum正好是26,那么结论就是在没有group by的作用下,sum等聚合函数是作用在全局的。
那么为什么不大于26的比较结果都是1呢,
这个是mysql的复写操作,没有group的前提下,使用聚合函数,不符合语法,默认添加了group by null这样就符合了语法
实际效果就是 limit 1;
那么久清楚了,select a from test having sum(b)>1;
复写为:select a from test group by null having sum(b)>1;
实际效果就是:select a from (select * from test limit 1) o where sum(b)>1;
sum(b)=26,大于1为真,就输出limit 1的结果,如果sum(b)>26为假,出差null;
========================================================================
再试试maxcomputer(odps),其实结果差不多,同样可以省略select中做聚合和别名操作,直接在having中进行,
但是,odps的语法要求必须有group by,select中key的字段必须在group中有体现,所以没有了group by null的操作。
如果没有,会语法报错,当然,可以用distinct代替group by,自己测试的结果是,在odps中distinct操作是直接被转成group by操作的。。。。
回过来有测试了rds的distinct发现是不可以,说明,rds的distinct并不是直接转成功group by这么。。。
rds中group by与distinct是有区别的,最直观的就是group by后可以在分组的数据内部做排序,筛选,distinct没有。。。
自己总结归纳,如有误解,请指教。。。