关于数据库中的 group by 子句。

关于数据库中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;//正确。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值