#进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 【where 筛选条件】 group by 分组的列表 【order by 子句】 注意: 查询列表必须特殊,要求是分组函数和group by后出现的字段 特点: 1.分组查询中的筛选条件分为两类 数据源 位置 关键字 分组前筛选 原始表 group by 前 where 分组后筛选 分组后的结果集 group by 后 having 分组函数做条件,一定是放在having子句之中 group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或者函数(用的较少) 也可以添加排序(排序放在分组查询的最后) */ # 引入:查询每个部门的平均工资 select avg(salary) from employees; #这个是整个表格的基本工资 #需要拆分小组 select avg(salary),department_id from employees group by department_id; #这个结果不太对 select distinct department_id from employees; #案例1:查询每个工种的最高工资 select max(salary),job_id from employees group by job_id; #案例2:查询每个位置上的部门个数 select count(department_id),location_id from departments group by location_id; #添加 分组前 筛选条件 #案例1:查询邮箱中包含a字符的,每个部门的平均工资 select avg(salary),department_id from employees where email like "%a%" group by department_id; #案例2:查询有奖金的每个领导手下员工的最高工资 select max(salary),manager_id from employees where commission_pct is not null group by manager_id; #添加 分组后 的复杂的筛选条件 #案例1:查询哪个部门的员工个数>2 select count(*),department_id from employees where count(*)>2 group by department_id; #这个是错误的,因为employees中没有 count(*)>2 这里使用having select count(*),department_id from employees group by department_id having count(*)>2 ; #案例2:查询每个工种有奖金的员工,他们的最高工资>12000的工种编号和最高工资 select max(salary),job_id from employees where commission_pct is not null group by job_id; #获得有奖金条件下的,每个工种的最高工工资 # 加上:他们的最高工资>12000的工种编号和最高工资 select max(salary),job_id from employees where commission_pct is not null group by job_id having max(salary)>12000; #案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低的工资 筛选条件: where manager_id>102 having min(salary)>5000 完整: select min(salary),manager_id from employees where manager_id>102 group by manager_id having min(salary)>5000; # group by 后跟 表达式或者分组函数(可以不是简单的字段) #案例:按照员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些 select count(employee_id),length(last_name) from employees group by length(last_name) having count(employee_id)>5; # 按照多个字段分组 #案例:查询每个部门每个工种的员工的平均工资 select avg(salary),department_id,job_id from employees group by department_id,job_id; # 添加排序 #案例:查询每个部门每个工种的员工的平均工资,并且按照平均工资的高低显示 select avg(salary),department_id,job_id from employees group by department_id,job_id order by avg(salary) desc; order by 后面可以跟函数语句。 #题目1:查询各个job_id的员工工资的最大值、最小值、平均值、总和,并按照job_id升序 select max(salary),min(salary),avg(salary),sum(salary),job_id from employees group by job_id order by job_id asc; #题目2:查询员工最高工资和最低工资的差距(difference) select max(salary)-min(salary) difference from employees; #题目3:查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内。 筛选条件: where manager_id is not null having min(salary)>=6000 select min(salary),manager_id from employees where manager_id is not null group by manager_id having min(salary)>=6000; #题目4:查询所有部门的编号,员工数量和工资的平均值,并按照平均工资降序 select count(employee_id),avg(salary),department_id from employees group by department_id order by avg(salary) desc; #题目5:选择具有各个job_id的员工人数 select count(*),job_id from employees group by job_id;