在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;
注意:
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将按以下方式对组进行限定:
- 对行进行分组。
- 应用组函数。
- 显示符合HAVING子句的组。