暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL语句 之 分组统计查询之having

晟数学院 2021-04-16
1938
 

点击“蓝字”关注我们


晟数学院DBA成长日记--SQL篇

分组统计查询之having

目的:分组之后的数据进行再次过滤。

例如,要求选出部门人数超过5个人的部门信息。先要按照部门进行分组统计,而后再通过统计结果进行数据过滤,要想实现这样的功能,只能通过HAVING子句来完成。

having子句的SQL执行流程

  1. 执行FROM子句,确定要检索的数据来源。

  2. 执行WHERE子句,使用限定符对数据行进行过滤。

  3. 执行GROUP BY子句,根据指定字段进行分组。

  4. 执行HAVING子句,对分组后的统计数据进行过滤。

  5. 执行SELECT子句,确定要检索出的分组字段以及编写相应统计函数。

  6. 执行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子句。

推荐阅读

SQL语句 之 分组统计查询之count

晟数学院DBA成长日记

SQL语句 之 伪列

晟数学院DBA成长日记

SQL语句 之 数据操作语言

晟数学院DBA成长日记

记得长按上方二维码关注我们~
文章转载自晟数学院,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论