【转载】为什么聚合后不能再引用原表中的列

来自:https://www.cnblogs.com/youzhibing/p/11516154.html

为什么聚合后不能再引用原表中的列

  很多人都知道聚合查询的限制,但是很少有人能正确地理解为什么会有这样的约束。表 tbl_student_class 中的 cname 存储的是每位学生的班级信息,但需要注意的是,这里的 cname 只是每个学生的属性,并不是小组的属性,而 GROUP BY 又是聚合操作,操作的对象就是由多个学生组成的小组,因此,小组的属性只能是平均或者总和等统计性质的属性,如下图

  询问每个学生的 cname 是可以的,但是询问由多个学生组成的小组的 cname 就没有意义了。对于小组来说,只有"一共多少学生"或者"最大学号是多少?"这样的问法才是有意义的。强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误;而 GROUP BY 的作用是将一个个元素划分成若干个子集,使用 GROUP BY 聚合之后,SQL 的操作对象便由 0 阶的"行"变为了 1 阶的"行的集合",此时,行的属性便不能使用了。SQL 的世界其实是层级分明的等级社会,将低阶概念的属性用在高阶概念上会导致秩序的混乱,这是不允许的。此时我相信大家都明白:为什么聚合后不能再引用原表中的列 。

============================================================

使用聚合函数时,不能同时使用where,可以使用having

 常用聚合函数min(),max(),count(),sum(),avg()等常和group by结合使用。

select sex,count(*) from table where count(*)>5   报错

sql语句的执行过程是:

from-->where-->group by -->having --> select--- >order by;

聚合函数针对结果集,where并不是在结果集后运行。

having针对结果集,把聚合函数放在having之后。

select class,count(*) from table having count(*)>5

 

原文地址:https://www.cnblogs.com/ww-xiaowei/p/11535682.html