分组函数

在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中没有对应所以就会出错如下


分组函数_第1张图片
出错


• 通过使用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子句的组。

你可能感兴趣的:(分组函数)