聚合函数
聚合函数类型 | 解释 |
---|---|
MAX() | 求最大值 |
MIN() | 求最小值 |
AVG() | 求平均值 |
COUNT() | 统计个数 |
SUM() | 求和 |
--查询所有员工的最高工资,最低工资,平均工资,以及工资合计
SELECT MAX(E.SAL) ,MIN(E.SAL) ,ROUND(AVG(E.SAL)) ,SUM(E.SAL)
FROM EMP E;
-- ROUND()表示将括号内的值四舍五入计算
分组
GROUP BY 分组
聚合函数结合分组表达式一起使用,表示分组统计
聚合函数汇总后进行计算,计算结果 返回一个值
如果对查询的结果集(表)做了分组,那么每个组会返回一个计算结果
-- 查询每个部门的人数,他们的平均工资 ,人数
SELECT DEPTNO,AVG(SAL) 部门平均工资 ,COUNT(*) 部门人数
FROM EMP
GROUP BY DEPTNO; --按部门分组
HAVING 后面跟分组后的过滤条件
-- 查询每个部门的人数,他们的平均工资 ,要求部门人数大于3人
SELECT DEPTNO,COUNT(*) 部门人数,AVG(SAL) 部门平均工资
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*)>3; --having 后面可以直接用 聚合函数作为条件
where和having的区别
- where必须放在group by 之前,而having必须放在group by 之后
- having后面可以直接跟聚合函数作为条件,而where后面不行
- where后面可以跟除了聚合函数之外的所有条件
而having只能跟聚合函数和分组字段作为过滤条件
-- 查询出各部门的人数,要求工资高于1500 (SAL > 1500)
SELECT DEPTNO,COUNT(*)
FROM EMP
WHERE SAL >1500
GROUP BY DEPTNO;
--查出个各部门的人数,要求最低工资高于 1000
SELECT DEPTNO,COUNT(*) 部门人数,MIN(SAL) 部门最低工资
FROM EMP
GROUP BY DEPTNO
HAVING MIN(SAL)>1000;
-HAVING后面可以跟 分组字段作为过滤条件
--查出各部门的人数,要求部门编号等于 10 和30
--方法1
SELECT DEPTNO,COUNT(*)
FROM EMP
WHERE DEPTNO IN (10,30)
GROUP BY DEPTNO;
--方法2
SELECT DEPTNO,COUNT(*)
FROM EMP
GROUP BY DEPTNO
HAVING DEPTNO IN (10,30);
总结
- 聚合函数放在SELECT后面查询时,只能跟分组字段一起查询,未分组的字段不能跟聚合函数同时放在SELECT后面
- GROUP BY以后,SELECT后面只能跟 分组的字段和聚合函数
- 只要不是FROM后面的表中数据/字段,不受上述1和2条件的限制
SELECT DEPTNO ,COUNT(*)部门人数 , 1 , 'ABC'
FROM EMP
GROUP BY DEPTNO ;
- GROUP BY 可以同时对多列进行分组,计算结果也是多列分组后的计算结果
-- 查询各部门,各种岗位的人数
SELECT DEPTNO ,JOB ,COUNT(*) 各部门各职位人数
FROM EMP
GROUP BY DEPTNO ,JOB ; -- 按多个字段分组,只需要在每个字段之间用逗号隔开即可