关于数据库中group by 分组语句,之前我也理解的不是很清楚,现在觉得理解清楚了,说一下我以前的错误想法和现在的正确想法。
首先大家都知道 group by 是对数据库查询出来的结果进行分组,但是根据什么分组往往会困扰我们,现在的规则是这样的。分组函数的分组依据,一定是前边select语句中出现的列,不然,你的分组就会出错,或者说,如果你的select语句中多余出现的列要通过聚集函数来进行聚集,才能形成正确的 SQL 语句。
关于这个规则,以前我错误的认识是这样的:
我的分组列,跟前边select 列是没有关系的,分组后我依然可以形成一个和原来表一样大小的表,但是只是按照现在的分组方式进行了元素的排列罢了。
注意到了没有,我的想法很傻很天真呀。本质的错误就是,我的分组后,除了分组列是不可能重复的之外,其他的select 列是在相同的组内是有重复值的。而group by 的本质上就是为了把 多行数据进行分组合并。或者说,每一个组得到分组结果必须是仅有的一行数据,而之前的做法和想法很明显相同的组会出现很多次在查询结果中(虽然语句不会执行,但我们的想象结果肯定是这样的)这违反犯了上述本质规则。
所以,处理办法有两个,一个,就是在group by 列选项中加入前边select 列选项中多余的列,(当然也可以把前边select 列选项中多余的列删掉)或者就是把,select 列选项中多余的 列用 聚集函数进行计算,如 sum(),max(),count(),avg 等进行聚集就能返回一个值,从而形成一列完整的数据了。这样就符合数据库的分组要求了。
说了很多,除了我自己能够完整的读下去,并且理解外,估计其他人都不会怎么看完。
反正我觉得本质就是,group by 的结果,按照 group by 列选择项 形成一行数据,注意是一行,如果形成的数据,有可能不是一样,那么这条语句肯定是不能执行的。
下边列个容易出错的地方:
select col.col1 col.col2 from col group by col.col1; 这就是上述本质错误,最容易出错的地方。
select count(*) from col group by col.col1;// 正确
select col.col1,count(col.col2) from col group by col.col1;//正确。