Java培训学习之分组查询

发布时间:2020年01月31日作者:atguigu浏览次数:696

1.    分组查询

所谓的分组查询,也就是把所有的数据按照条件分成多组然后分别对每组数据使用组函数进行查询把数据分成多少组,最终就会得到多少条结果。当需要分组查询时需要使用GROUP BY子句。例如查询每个部门的工资和,就需要使用分组查询。

分组查询的规则:

  1. 出现在查询列表中的字段,要么出现在分组函数中,要么出现在GROUP BY子句中; 或者分组字段仅仅出现在GROUP BY中(这种方式不推荐使用)
  2. 可以按照当个字段分组;可以按照多个字段分组。
  3. 对分组后的字段进行过滤,不能使用WHERE,而是要使用HAVING子句;Having不能单独使用,必须和GROUP BY一起使用
  4. 也可以在分组前对数据使用WHERE进行过滤
  5. 分组后再次过滤的数据可以使用ORDER BY进行排序
  6. 语句执行的顺序:

select 分组函数④,分组的字段 — ⑥

from 表名 —   ①

where 分组前的筛选条件– ②

group by 分组的字段,…  — ③

having 分组后的筛选条件 — ⑤

order by 排序列表 –⑦

SQL Select 语句完整的执行顺序:
1、from 子句组装来自不同数据源的数据;
2、where 子句基于指定的条件对记录行进行筛选;
3、group by 子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用 having 子句筛选分组;
7、select 的字段;
8、使用 order by 对结果集进行排序。

数据过滤的方式分为两种:分组前过滤和分组后过滤

 

针对的数据

使用的关键字

出现的位置

分组前过滤

原始表中的数据

Where

Group by 之前

分组后过滤

分组之后的数据

Having

Group by 之后

原则:能在where中过滤的数据,尽量在where中过滤,效率较高,因为这样可以减少分组。having的过滤是专门对分组之后的数据进行过滤的。

案例:

1)简单的分组

案例1:查询每个工种的员工平均工资

SELECT JOB,MIN(SAL) MINSAL

FROM EMP

GROUP BY JOB;

2)可以实现分组前的筛选

案例1:查询名字中包含a字符的 ,每个部门的最高工资

SELECT DEPTNO ,MAX(SAL) ,MIN(SAL)

FROM EMP

WHERE ENAME LIKE ‘%A%’

GROUP BY DEPTNO;

案例2:查询有没有奖金的每个职位的平均工资

SELECT JOB ,MAX(SAL) ,MIN(SAL)

FROM EMP

WHERE COMM IS NULL

GROUP BY JOB;

3)可以实现分组后的筛选

案例1:查询哪个部门的员工个数>5

SELECT DEPTNO , COUNT(EMPNO) COUNTEMP

FROM EMP

GROUP BY DEPTNO

HAVING COUNTEMP >=5;

案例2: 按照部门编号分组,查询平均工资,并且显示平均工资大于2000的记录

SELECT DEPTNO, AVG(SAL) AVGSAL

FROM EMP

GROUP BY DEPTNO

HAVING AVGSAL > 2000;

 4)可以实现排序

案例:每个工种没有有奖金的员工的最高工资>2000的工种编号和最高工资,按最高工资升序

SELECT JOB ,MAX(SAL) MAXSAL

FROM EMP

WHERE COMM IS NULL

GROUP BY JOB

HAVING MAXSAL > 2000

ORDER BY MAXSAL DESC;

5)按多个字段分组

案例:查询每个工种每个部门的最低工资,并按最低工资降序

SELECT JOB ,DEPTNO ,MIN(SAL) MINSAL

FROM EMP

GROUP BY JOB ,DEPTNO

ORDER BY MINSAL;

 想要了解跟多关于Java培训课程内容欢迎关注尚硅谷Java培训,尚硅谷除了这些技术文章外还有免费的高质量Java培训课程视频供广大学员下载学习


上一篇:
下一篇:
相关课程

java培训 大数据培训 前端培训 UI/UE设计培训

关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园2号楼3层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)

西安市雁塔区和发智能大厦B座3层(西安校区)