group by语句,聚合函数与其他语句关系,执行过程

(本文一切基于sql SERVER 2008 R2)

先来看一个语句执行过程发生的错误提示

  1. 消息8120,级别16,状态1,第2行
  2. 选择列表中的列'SC.CNO'无效,因为该列没有包含在聚合函数或GROUPBY子句中。

数据库为Stu_C,含有三个表,S、SC、C。执行的语句如下:

  1. useStu_C
  2. selectSNO,cno,sum(grade)sum_grade
  3. fromSC
  4. whereGRADE>=60
  5. groupbySC.SNO
  6. havingcount(CNO)>=4
  7. orderbysum_gradedesc
  1. 目的是检索选修4门课以上课程的学生总成绩(排除不及格的),并按总成绩的降序排列出来。根据提示我们容易知道,select语句中多了cno这个属性列。如果将其去掉执
  2. 行如下:
  1. useStu_C
  2. selectSNO,sum(grade)sum_grade
  3. fromSC
  4. whereGRADE>=60
  5. groupbySC.SNO
  6. havingcount(CNO)>=4
  7. orderbysum_gradedesc
  1. 结果:
  1. <imgsrc="http://hi.csdn.net/attachment/201111/8/0_132075203785L5.gif"alt=""/>
  1. 分析及结论:
  1. 当使用groupby子句时则select中关于表的原始属性名只能是被"by"属性,如上例中的SNO。若想输出其他属性列,则应在select子句后加上相应的聚合函数(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其实这也很容易理解,当参照SNO被分组后,每一个SNO的具体实例与其他任意一个属性都变成一对一或一对多的关系,只有通过聚合函数将每组其他想要的属性的多个实例算成一个值,即SNO与其形成一对一的关系后才能列出。而且一旦sql语句中使用了groupby子句后聚合函数都变成分别对每组起作用。
  1. 一条sql语句个子句的先后作用过程:

fromwheregroup byselect(含聚合函数order by

所以当select子句中含有sum(grade) sum_grade时,最后的排序子句可以是order by sum_grade desc。

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...