where后不能接聚合函数,having后面可以接
聚合函数就用来输入多个数据,输出一个数据的
常用聚合函数:avg/count/max/min/sum
出现在select后面的单独的列,必须出现在group by子句中作为分组列
即:
没有出现在group by后面的分组列,不能被select后面单独选出来,必须用聚合函数将其取出。
比如,如下表所示:
不能够这样写:select * from Table group by name,一定不能是*,select后只能是某一个列(该列只能是group by后的name)或者某个列(其他列)的聚合函数。
一旦数据被group by name之后,所有的数据都会被分组,如下所示
image.png
在group by name以后,得到上面的虚拟表3,如果此时进行select * ,则只会取出每组name中靠前的那个id,数据不准确。
要想取出正确的想要的数据,可以对id列或者number列进行聚合函数(聚合函数会对每组name中的数据在进行一次分组聚合,取出相应的max或者min或者count)
对一列进行分组和对多列进行分组都是一样的情况 group by name,number
image.png
select后除了单独的列name,number可以接以外,要接其他的列必须用聚合函数来接。
参考自:https://blog.csdn.net/intmainhhh/article/details/80777582
以上思路在case when then else end句型中,仍然受用。
case when 实现行转列时要用max()或者其他聚合函数
https://blog.csdn.net/u014180504/article/details/79150492
进行group by分组以后,有些组内可能会有多个数据,如果不进行组内聚合函数,则会默认取出第一条记录,此时可能就会发生错误。
网友评论