分组统计查询
2017年11月13日
20:36
统计函数
- 统计个数:COUNT(* | [DISTINCT]字段)
--COUNT(*):明确地返回表中的数据个数,是最准确的。
--COUNT(字段):不统计为null的数据个数。
--COUNT([DISTINCT]字段):统计消除重复数据后的数据个数。
- MAX(字段)、MIN(字段)
- SUM(字段)、AVG(字段)
分组统计查询
分组是部分数据具有共性。
分组子句GROUP BY
GROUP BY 分组字段,分组字段
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY(job) ;
分组操作存在严格的限制
1、在没有编写GROUP BY子句的时候,那么SELECT子句之中只允许出现统计函数,不允许出现任何的其他字段。
错误代码 | 正确代码 |
SELECT COUNT(empno),ename FROM emp ; | SELECT COUNT(empno) FROM emp ; |
2、在使用GROUP BY子句分组字段的时候,SELECT子句中只允许出现统计函数和分组字段
SELECT job,COUNT(empno),ename FROM emp GROUP BY job ; | SELECT job,COUNT(empno) FROM emp GROUP BY job ; |
3、统计函数允许嵌套查询,但是嵌套后的统计查询中,SELECT 子句里面不允许再出现任何的字段,包括分组字段,只能够使用嵌套的统计函数。
SELECT deptno,MAX(AVG(sal)) FROM emp GROUP BY deptno ; | SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno ; |
SELECTd.deptno,d.dname,d.loc,COUNT(e.empno),TRUNC(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12))year
FROM dept d,emp e
WHERE d.deptno = e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc ;
HAVING子句对分组后的数据筛选
【⑤确定要显示的数据列】SELECT [DISTINCT] 分组字段[别名],…| 统计函数
【①确定要查找的数据来源】FROM
【②针对数据进行筛选】WHERE 条件
【③针对数据进行分组】GROUP BY 分组字段,分组字段,….
【④对分组后的数据筛选】HAVING 条件
【⑥对返回结果排序】ORDER BY 字段 [ASC | DESC],…,…