1. 分组查询
所谓的分组查询,也就是把所有的数据按照条件分成多组,然后分别对每组数据使用组函数进行查询。把数据分成多少组,最终就会得到多少条结果。当需要分组查询时需要使用GROUP BY子句。例如查询每个部门的工资和,就需要使用分组查询。
分组查询的规则:
- 出现在查询列表中的字段,要么出现在分组函数中,要么出现在GROUP BY子句中; 或者分组字段仅仅出现在GROUP BY中(这种方式不推荐使用)
- 可以按照当个字段分组;可以按照多个字段分组。
- 对分组后的字段进行过滤,不能使用WHERE,而是要使用HAVING子句;Having不能单独使用,必须和GROUP BY一起使用
- 也可以在分组前对数据使用WHERE进行过滤
- 分组后再次过滤的数据可以使用ORDER BY进行排序
- 语句执行的顺序:
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培训学习常见函数之聚合函数
下一篇: 大数据培训Sqoop之命令&参数-metastore