分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。
分组函数常用到以下五个函数:
1、MIN()
2、MAX()
3、SUM()
4、AVG()
5、COUNT()
MIN和MAX函数主要是返回每组的最小值和最大值。
MIN([DISTINCT|ALL] column|expression)
MAX([DISTINCT|ALL] column|expression)
eg:查询入职日期最早和最晚的日期
SQL> SELECT MIN(HIREDATE), MAX(HIREDATE)
FROM EMP
SUM和AVG函数分别返回每组的总和及平均值。
SUM([DISTINCT|ALL] column|expression)
AVG([DISTINCT|ALL] column|expression)
注意:SUM和AVG函数都是只能够对数值类型的列或表达式操作。
eg:查询职位以SALES开头的所有员工平均工资、最低工资、最高工资、工资和。
SELECT AVG(SAL), MAX(SAL),MIN(SAL), SUM(SAL)
FROM EMP
WHERE JOB LIKE 'SALES%';
COUNT函数的主要功能是返回满足条件的每组记录条数。
COUNT( *|{[DISTINCT|ALL] column|expression})
eg:查询部门30有多少个员工
SELECT COUNT(*)
FROM EMP
WHERE DEPTNO = 30;
注意:
(1)分组函数中DISTINCT会消除重复记录后再使用分组函数
(2)除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行计算
(3)在分组函数中使用NVL函数,可以使分组函数强制包含含有空值的记录
(1)查询部门20的员工,每个月的工资总和及平均工资。
SELECT SUM(SAL),AVG(SAL)
FROM EMP
WHERE DEPTNO = 20
(2)查询工作在CHICAGO的员工人数,最高工资及最低工资。
SELECT COUNT(ENAME),MAX(SAL),MIN(SAL)
FROM EMP,DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'CHICAGO'
SELECT COUNT(DISTINCT JOB)
FROM EMP
实现:查询每个部门的平均工资
通过 GROUP BY 子句可将表中满足WHERE条件的记录按照指定的列划分成若干个小组,其中GROUP BY子句指定要分组的列。
注意:
(1)在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY 子句中。
(2)GROUP BY 所指定的列并不是必须出现在SELECT 列表中。
SELECT AVG(SAL) SELECT DEPTNO, COUNT(ENAME)
FROM EMP FROM EMP
GROUP BY DEPTNO;
//没毛病 //error
eg:查询每个部门每个岗位的工资总和。
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
(1)查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
SELECT EMP.DEPTNO,DNAME,COUNT(ENAME),MAX(SAL),MIN(SAL),SUM(SAL),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME
(2)查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
SELECT EMP.DEPTNO,DNAME,JOB,COUNT(ENAME),MAX(SAL),MIN(SAL),SUM(SAL),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY JOB,EMP.DEPTNO,DNAME
ORDER BY DEPTNO
(3)查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
SELECT MANAGER.EMPNO AS MGRNO, MANAGER.ENAME AS MGRNAME, COUNT(WORKER.ENAME)
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO(+) AND DEPT.DEPTNO = WORKER.DEPTNO
GROUP BY MANAGER.EMPNO,MANAGER.ENAME
1.使用HAVING子句排除组结果。
注意:
(1)HAVING子句要在GROUP BY之后才能使用
(2)HAVING子句相当于WHERE但是只能用于分组函数作为筛选条件的情况下
(1)查询部门人数大于2的部门编号,部门名称,部门人数。
SELECT EMP.DEPTNO, DNAME, COUNT(ENAME)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME
HAVING COUNT(ENAME)>2
(2)查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序。
SELECT EMP.DEPTNO, DNAME, COUNT(ENAME),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME
HAVING COUNT(ENAME)>2 AND AVG(SAL)>2000
ORDER BY COUNT(ENAME)
eg:显示平均薪水的最大值
SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY DEPTNO;