zoukankan      html  css  js  c++  java
  • 【转载】为什么聚合后不能再引用原表中的列

    来自: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

     

  • 相关阅读:
    20200721_34代码如何优化以及框架的运用和构建设计
    20200719_33appium应用及H5页面元素定位下
    20200709_29多线程与分布式
    day4_day4_python
    python_day3
    python第二天
    pytihon初学第一天
    移动平均线系列
    网页爬取
    十种经典排序算法
  • 原文地址:https://www.cnblogs.com/ww-xiaowei/p/11535682.html
Copyright © 2011-2022 走看看