加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:07:21 所属栏目:百科 来源:网络整理
导读:( 本文一切基于SQL SERVER 2008 R2 ) ? 先来看一个语句执行过程发生的错误提示: [html] view plain copy print ? 消息?8120,级别?16,状态?1,第?2?行?? ?选择列表中的列?‘SC.CNO‘?无效,因为该列没有包含在聚合函数或?GROUP?BY?子句中。?? 消息 8120,

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

?

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

[html] view plain copy
print ?
  1. 消息?8120,级别?16,状态?1,第?2?行??
  2. ?选择列表中的列?‘SC.CNO‘?无效,因为该列没有包含在聚合函数或?GROUP?BY?子句中。??

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

????????

[sql] view plain copy
print ?
  1. use?Stu_C??
  2. select?SNO,cno,sum(grade)?sum_grade??
  3. from?SC??
  4. where?GRADE>=60??
  5. group?by?SC.SNO??
  6. having?count(CNO)>=4??
  7. order?by?sum_grade?desc??
[sql] view plain copy
print ?
  1. ?目的是检索选修4门课以上课程的学生总成绩(排除不及格的),并按总成绩的降序排列出来。根据提示我们容易知道,select语句中多了cno这个属性列。如果将其去掉执??
  2. ?行如下:??
[sql] view plain copy
print ?
  1. use?Stu_C??
  2. select?SNO,sum(grade) sum_grade from SC where GRADE>=60 group by SC.SNO having count(CNO)>=4 order by sum_grade desc
    [sql] view plain copy
    print ?
    1. 结果:??
    [sql] view plain copy
    print ?
    1. ???
    [sql] view plain copy
    print ?
    1. 分析及结论:??

    [sql] view plain copy
    print ?
    1. 当使用group?by子句时则select中关于表的原始属性名只能是被"by"的属性,如上例中的SNO。若想输出其他属性列,则应在select子句后加上相应的聚合函数(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其实这也很容易理解,当参照SNO被分组后,每一个SNO的具体实例与其他任意一个属性都变成一对一或一对多的关系,只有通过聚合函数将每组其他想要的属性的多个实例算成一个值,即SNO与其形成一对一的关系后才能列出。而且一旦SQL语句中使用了group?by子句后聚合函数都变成分别对每组起作用。??
    [sql] view plain copy
    print ?
    1. 一条SQL语句个子句的先后作用过程:??

    ? fromwheregroup byselect(含聚合函数)order by

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读