我心乱了,很苦恼,很高手解答select 课程号,avg(分数)
  from 成绩表
  where 课程号='030105'是不是错了??
应该写成这样?
select 课程号,avg(分数)
  from 成绩表
  where 课程号='030105'
  group by 课程号
似乎有这样一句话???使用聚合函数就要用group by   又似乎不对,乱了乱了,以前学的知识之间打架了
我想可能是你理解的有问题 
select 课程号,avg(分数)
  from 成绩表
  where 课程号='030105'
  group by 课程号
如果select后面有非聚合函数的列就要用group by select avg(分数)
  from 成绩表
  where 课程号='030105';   如果是这样就不用???
我心乱了,很苦恼,很高手解答

解决方案 »

  1.   

    楼主是没有弄明白什么时候该用group by ,因为在where子句中对课程号进行了限制,所以这时就不可以不用group by 了
    select 课程号,avg(分数)
      from 成绩表
      where 课程号='030105'
      

  2.   

    集合函数经常配合GROUP BY 或 HAVING 使用,但是他们也是可以单独使用的
    例如:with  tb_b as (
    select 'a' subId,2 score from dual union all
    select 'a' subId,6 score from dual union all
    select 'b' subId,8 score from dual union all
    select 'c' subId,4 score from dual union all
    select 'c' subId,3 score from dual union all
    select 'c' subId,5 score from dual)select avg(score)  from tb_b  where subId='a';楼主第一句sql,因为检索了[课程号],当然就不对了
    楼主的第二句sql是正确的。
    你说的,是正确的。
    group by 不允许出现在where之中,但是允许出现在where子句后面,正如您的第二局sql。
      

  3.   

    在SELECT语句中出现聚合函数(SUM,MIN,MAX....)时候,聚合函数字段以外的所有字段一定要在GROUP BY 中出现,如果没有,可以不用GROUP BY
    这样就解释了你的疑惑。很多人都经历过这样的疑惑。
      

  4.   

    哦,是的,谢谢你的提醒。应该是这样的,
    --员工信息表
    SELECT t.deptno,SUM(t.sal) FROM emp t 
    WHERE t.deptno='20'
    GROUP BY t.deptno
    或者是
    --员工信息表
    SELECT SUM(t.sal) FROM emp t 
    WHERE t.deptno='20'
    我也不知当时我是怎么想的
      

  5.   

    可以这样写
    select avg(分数)
      from 成绩表
      where 课程号='030105'如果加上课程号列的话,会存在两列行数不对应问题,avg(分数)是一行,而课程号可能是多行
      

  6.   

    记住下面这句话:只要出现列名+分组函数,就要有group by子句;出现在select列表中的列必须出现在group by子句中,但出现在group by子句中的列可以不出现在select列表中
      

  7.   

    不知下面的语句能否满足你的要求。
    SELECT 课程号,AVG(分数)
      FROM 成绩表
      GROUP BY 课程号 HAVING 课程号='030105';
      

  8.   

    select 课程号,avg(分数)
      from 成绩表
      where 课程号='030105'select 后面出现了课程号,意思是按照课程号来分组求平均数。
    所以你必须group by 课程号,否则逻辑上是有问题的。select avg(分数)
      from 成绩表
      where 课程号='030105'
    这没有问题的原因在于,你是对所有的课程求平均分,或者摸一个课程的平均分。返回一个值,当然就不用分组了。