
很多情况下,我们需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数,这个时就要用到SQL的分组查询,又称为聚合查询。
聚合操作的语法如下:
| SELECT [field1,field2,……fieldn] fun_name FROM tablename [WHERE where_contition] [GROUP BY field1,field2,……fieldn [WITH ROLLUP]] [HAVING where_contition] |
对其参数进行以下说明。
¡ fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
¡ GROUP BY关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面。
¡ WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总。
¡ HAVING关键字表示对分类后的结果再进行条件的过滤。
注意:having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。
示例:要emp表中统计总人数:
| SQL> SELECT COUNT(1) FROM emp; COUNT(1) ---------- 14 |
示例:在此基础上,要统计各个部门的人数。
| SQL> SELECT deptno,count(1) FROM emp GROUP BY deptno; DEPTNO COUNT(1) ------ ---------- 30 6 20 5 10 3 |
示例:统计人数大于3人的部门。
| SQL> SELECT deptno,count(1) FROM emp GROUP BY deptno HAVING COUNT(1)>3; DEPTNO COUNT(1) ------ ---------- 30 6 20 5 |
示例:统计emp表所有员工的工资总额、最高和最低工资。
| SQL> SELECT SUM(sal),MAX(sal),MIN(sal) FROM emp; SUM(SAL) MAX(SAL) MIN(SAL) ---------- ---------- ---------- 29025 5000 800 |
示例:统计emp表所部门编号为10和各职位人数。
| SQL> SELECT job,count(1) 2 FROM emp 3 WHERE deptno=10 4 GROUP BY job 5 ORDER BY job; JOB COUNT(1) --------- ---------- CLERK 1 MANAGER 1 PRESIDENT 1 |
来源:oschina
链接:https://my.oschina.net/u/2971691/blog/784642