#进阶6:分组查询
语法:
select 查询列表 ④
from 表名——————————①
where 分组前条件—— ②
group by 分组的字段③
having 分组后条件 ⑤
order by 排序列表 ⑥
特点:
1、查询列表往往是:分组函数和分组后的字段
换句话说,和分组函数一同查询的字段,一般就是分组后的字段
2、分组查询的筛选有两种:分组前筛选和分组后筛选
连接关键字 位置 筛选的结果集
分组前筛选 where group by前面 原始表
分组后筛选 having group by后面 分组后的查询结果(虚拟表)
结论:分组函数做条件 肯定是 分组后筛选条件!!!
3、分组查询可以通过单个字段,也可以通过多个字段,中间用逗号隔开
#1)简单的分组 #案例1:查询每个工种的员工平均工资 SELECT AVG(salary) 平均工资,job_id FROM employees GROUP BY job_id; #2)可以实现分组前的筛选 #案例1:查询邮箱中包含a字符的 每个部门的最高工资 SELECT MAX(salary) ,department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id; #案例2:查询有奖金的每个领导手下员工的平均工资 SELECT AVG(salary) 平均工资,manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id; #3)可以实现分组后的筛选 #案例1:查询哪个部门的员工个数>5 #①查询每个部门的员工个数 SELECT COUNT(*) 员工个数,department_id FROM employees GROUP BY department_id #②查询①结果集中,有哪个部门的员工个数>5 SELECT COUNT(*) 员工个数,department_id FROM employees GROUP BY department_id HAVING COUNT(*)>5 #案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 SELECT job_id,MAX(salary) 最高工资 FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING 最高工资>12000; #案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资 SELECT manager_id,MIN(salary) 最低工资 FROM employees WHERE manager_id > 102 GROUP BY manager_id HAVING 最低工资>5000; #4)可以实现排序 #案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序 SELECT job_id,MAX(salary) 最高工资 FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING 最高工资>6000 ORDER BY 最高工资 ASC; #5)按多个字段分组 #案例:查询每个工种每个部门的最低工资,并按最低工资降序 SELECT MIN(salary) 最低工资,job_id,department_id FROM employees GROUP BY job_id,department_id ORDER BY 最低工资 DESC; #1. 查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序 SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM(salary) 和 FROM employees GROUP BY job_id ORDER BY job_id; #2. 查询员工最高工资和最低工资的差距(DIFFERENCE) SELECT MAX(salary)-MIN(salary) DIFFERENCE FROM employees; #3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000,没有管理者的员 #工不计算在内 SELECT MIN(salary) 最低工资,manager_id FROM employees GROUP BY manager_id HAVING 最低工资>=6000 AND manager_id IS NOT NULL; #4. 查询所有部门的编号,员工数量和工资平均值,并按平均工资降序 SELECT department_id,COUNT(*) 个数,AVG(salary) 平均工资 FROM employees GROUP BY department_id ORDER BY 平均工资 DESC; #5. 选择具有各个 job_id 的员工人数 SELECT COUNT(*) 人数,job_id FROM employees GROUP BY job_id;