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

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

 

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

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

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

        

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

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

  fromwheregroup byselect(含聚合函数)order by

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

转载于:https://www.cnblogs.com/jpfss/p/9139096.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值