• 让天下没有难学的技术
    多数学员都来自推荐,这就是口碑的力量

java编程学习之分组查询

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 对结果集进行排序。

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

<table data-draft-node=”block” data-draft-type=”table” data-size=”normal” data-row-style=”normal”>

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

案例:

1)简单的分组

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

SELECT JOB,MIN(SAL) MINSALFROM EMPGROUP BY JOB;
SELECT JOB,MIN(SAL) MINSALFROM EMPGROUP BY JOB;
SELECT JOB,MIN(SAL) MINSALFROM EMPGROUP BY JOB;
2)可以实现分组前的筛选

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

SELECT DEPTNO ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE ENAME LIKE ‘%A%’GROUP BY DEPTNO;
SELECT DEPTNO ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE ENAME LIKE ‘%A%’GROUP BY DEPTNO;
SELECT DEPTNO ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE ENAME LIKE ‘%A%’GROUP BY DEPTNO;
SELECT DEPTNO ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE ENAME LIKE ‘%A%’GROUP BY DEPTNO;
案例2:查询有没有奖金的每个职位的平均工资

SELECT JOB ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE COMM IS NULLGROUP BY JOB;
SELECT JOB ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE COMM IS NULLGROUP BY JOB;
SELECT JOB ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE COMM IS NULLGROUP BY JOB;
SELECT JOB ,MAX(SAL) ,MIN(SAL)FROM EMPWHERE COMM IS NULLGROUP BY JOB;
3)可以实现分组后的筛选

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

SELECT DEPTNO , COUNT(EMPNO) COUNTEMPFROM EMPGROUP BY DEPTNOHAVING COUNTEMP >=5;
SELECT DEPTNO , COUNT(EMPNO) COUNTEMPFROM EMPGROUP BY DEPTNOHAVING COUNTEMP >=5;
SELECT DEPTNO , COUNT(EMPNO) COUNTEMPFROM EMPGROUP BY DEPTNOHAVING COUNTEMP >=5;
SELECT DEPTNO , COUNT(EMPNO) COUNTEMPFROM EMPGROUP BY DEPTNOHAVING COUNTEMP >=5;
案例2: 按照部门编号分组,查询平均工资,并且显示平均工资大于2000的记录

SELECT DEPTNO, AVG(SAL) AVGSALFROM EMPGROUP BY DEPTNOHAVING AVGSAL > 2000;
SELECT DEPTNO, AVG(SAL) AVGSALFROM EMPGROUP BY DEPTNOHAVING AVGSAL > 2000;
SELECT DEPTNO, AVG(SAL) AVGSALFROM EMPGROUP BY DEPTNOHAVING AVGSAL > 2000;
SELECT DEPTNO, AVG(SAL) AVGSALFROM EMPGROUP BY DEPTNOHAVING AVGSAL > 2000;
4)可以实现排序

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

SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
SELECT JOB ,MAX(SAL) MAXSALFROM EMPWHERE COMM IS NULLGROUP BY JOBHAVING MAXSAL > 2000ORDER BY MAXSAL DESC;
5)按多个字段分组

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

SELECT JOB ,DEPTNO ,MIN(SAL) MINSALFROM EMPGROUP BY JOB ,DEPTNOORDER BY MINSAL;
SELECT JOB ,DEPTNO ,MIN(SAL) MINSALFROM EMPGROUP BY JOB ,DEPTNOORDER BY MINSAL;
SELECT JOB ,DEPTNO ,MIN(SAL) MINSALFROM EMPGROUP BY JOB ,DEPTNOORDER BY MINSAL;
SELECT JOB ,DEPTNO ,MIN(SAL) MINSALFROM EMPGROUP BY JOB ,DEPTNOORDER BY MINSAL;

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注