
点击“蓝字”关注我们

晟数学院DBA成长日记--SQL篇
分组统计查询之having
目的:分组之后的数据进行再次过滤。
例如,要求选出部门人数超过5个人的部门信息。先要按照部门进行分组统计,而后再通过统计结果进行数据过滤,要想实现这样的功能,只能通过HAVING子句来完成。

having子句的SQL执行流程
执行FROM子句,确定要检索的数据来源。
执行WHERE子句,使用限定符对数据行进行过滤。
执行GROUP BY子句,根据指定字段进行分组。
执行HAVING子句,对分组后的统计数据进行过滤。
执行SELECT子句,确定要检索出的分组字段以及编写相应统计函数。
执行ORDER BY子句。

需求:
列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资
解题思路:
步骤一:连接emp和dept表

步骤二:对临时表进行分组

步骤三:使用HAVING子句对分组后的数据进行再次过滤

注意:HAVING子句:在分组之后使用的,表示对分组统计后的数据进行再次过滤,可以使用统计函数,有GROUP BY子句之后才可以出现HAVING子句。

需求:
显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列
解题思路:
全部数据的筛选条件(WHERE子句),筛选出所有销售人员,另外一个条件就是对分组进行过滤(HAVING子句),通过SUM()函数求出月工资合集,并且要求结果大于5000,最后才可以通过ORDER BY子句进行排序,而且ORDER BY子句的默认顺序就是升序
步骤一:显示非销售人员的详细信息

步骤二:分组
SCOTT@SDEDU> select job,sum(sal) sum_sal
from emp where job!='SALESMAN' group by job;
JOB SUM_SAL
------------------ ----------------------
CLERK 4150
PRESIDENT 5000
MANAGER 8275
ANALYST 6000
步骤三:加入having子句
SCOTT@SDEDU> select job,sum(sal) sum_sal from emp where job!='SALESMAN'
2 group by job
3 having sum(sal)>5000;
JOB SUM_SAL
----------------- --------------
MANAGER 8275
ANALYST 6000
步骤四:加入排序
SCOTT@SDEDU> select job,sum(sal) sum_sal from emp where job!='SALESMAN'
2 group by job
3 having sum(sal)>5000
4 order by sum_sal asc;
JOB SUM_SAL
---------------- ------------------
ANALYST 6000
MANAGER 8275
Tips:什么时候使用WHERE子句?什么时候使用HAVING子句?
WHERE子句:在分组之前使用,表示从所有数据中筛选出部分数据,已完成分组的要求,在WHERE子句中不允许使用统计函数,没有GROUP BY子句也可以使用。
HAVING子句:实在分组之后使用的,表示对分组统计后的数据执行再次过滤,可以使用统计函数,有GROUP BY子句之后才可以出现HAVING子句。
推荐阅读
晟数学院DBA成长日记

晟数学院DBA成长日记

晟数学院DBA成长日记


