分组函数

作者: baobaodz | 来源:发表于2018-03-24 22:31 被阅读46次

    在SQL中常使用的组函数有以下几个:
    1、COUNT(): 求出全部的记录数
    2、MAX():求出一组中最大的值
    3、MIN():求出最小值
    4、AVG():求出平均值
    5、SUM():求和
    例如

    SELECT MAX(DEGREE),MIN(DEGREE),
    AVG(DEGREE),SUM(DEGREE),COUNT(*) FROM SCORE;
    --从成绩表中查询最高成绩,最低成绩,平均成绩,总成绩和成绩行树
    

    要使用分组统计,则首先应该固定其语法,使用GROUP BY 进行分组,此时的SQL语句格式如下:

    SELECT(DISTINCT)*|查询列1 别名1,查询列2 别名2...
    FROM 表名称1 别名1,表名称2 别名2
    (WHERE 条件)
    (GROUP BY 分组条件)
    (ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC)
    

    例如
    求每门课程的平均成绩

    --因为有好几门课程,所以涉及到分组
    SELECT CNO,AVG(DEGREE) FROM SCORE
    GROUP BY CNO;
    
    image.png

    注意:
    GROUP BY句中的列要与SELECT中一一对应,不然就报错。比如

    SELECT CNO,SNO,AVG(DEGREE) 
    FROM SCORE
    GROUP BY CNO;
    

    因为SELECT中的SNO学生号再GROUP BY中没有对应所以就会出错如下


    出错

    • 通过使用WHERE子句,可以在将行分成多个组之前先排除某些行。
    • 必须将列包括在GROUP BY子句中。
    • 不能在GROUP BY子句中使用列别名。
    另外,在where子句中不能出现分组函数

    SELECT CNO,AVG(DEGREE) 
    FROM SCORE
    WHERE AVG(DEGREE) > 85 --报错显示此处不允许使用分组函数
    GROUP BY CNO;
    

    但是如果需求是查询每门课程平均成绩高于85分的成绩表,该怎么实现呢?这时候就需要HAVING过滤查询

      SELECT CNO,AVG(DEGREE) 
      FROM SCORE
      GROUP BY CNO
      HAVING AVG(DEGREE)>85;
    

    使用HAVING子句时,Oracle将按以下方式对组进行限定:

    1. 对行进行分组。
    2. 应用组函数。
    3. 显示符合HAVING子句的组。

    相关文章

      网友评论

        本文标题:分组函数

        本文链接:https://www.haomeiwen.com/subject/rhqccftx.html