# 进阶5:分组查询/*
select 分组函数,列(出现在group by 后面) *********
from 表名
where 筛选条件
group by 分组条件
order by 排序条件
t特点: 1.分组查询中筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by前面 where
分组后筛选 分组后的表 group by后面 having
分组函数做条件肯定是放在having子句中;
能用分组前筛选优先使用分组前筛选
2.group 支持多个字段分组,用逗号隔开,不区分先后,也支持表达式或者函数(用的少)
3.也可以添加排序,放在最后
*/
# 案例1:查询每个工种的最高工资SELECTMAX(salary),job_id FROM employees GROUPBY job_id;
# 案例2:每个位置上的部门个数SELECTCOUNT(*), location_id FROM departments GROUPBY location_id;
# 添加筛选条件
邮箱中包含a字符的每个部门的平均工资
SELECTAVG(salary)FROM employees WHERE email LIKE'%a%'GROUPBY department_id
2.有奖金的每个领导收下员工的最高工资:有奖金的领导
SELECTMAX(salary),manager_id FROM employees WHERE commission_pct ISNOTNULLGROUPBY manager_id;
# 添加复杂的筛选条件# 案例1:查询哪个部门的员工数大于2 --->先分组再筛选 havingSELECTCOUNT(*),department_id FROM employees GROUPBY department_id HAVINGCOUNT(*)>2;
# 案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资SELECTMAX(salary),job_id FROM employees WHERE commission_pct ISNOTNULLGROUPBY job_id HAVINGMAX(salary)>12000;
# 案例3:领导编号大于102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资SELECTMIN(salary),manager_id FROM employees WHERE manager_id >102GROUPBY manager_id HAVINGMIN(salary)>5000;
# 按多个字段分组
每个部门每个gongzhong的员工平均工资--->多个字段放在GROUP BY 后面SELECTAVG(salary)FROM employees GROUPBY department_id,job_id
每个部门每个公众的员工平均工资,按平均工资高低显示
SELECTAVG(salary),department_id FROM employees GROUPBY department_id,job_id ORDERBYAVG(salary)DESC
练习
1.查询员工最高,最低工资差距
SELECTMAX(salary),MIN(salary),MAX(salary)-MIN(salary)FROM employees
2.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECTMIN(salary), manager_id FROM employees WHERE manager_id ISNOTNULLGROUPBY manager_id HAVINGMIN(salary)>6000;3.查询所有部门的编号,员工数量,工资的平均值(SELECT 员工数量,工资的平均值 GROUPBY部门编号)4.选择具有各个job_id的员工人数(SELECTCOUNT(*)FROMTABLEGROUPBY job_id)
进阶5:分组查询
select 分组函数,列(出现在group by 后面)*********
from 表名
where 筛选条件
group by 分组条件
order by 排序条件
特点:1.分组查询中筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by前面 where
分组后筛选 分组后的表 group by后面 having
分组函数做条件肯定是放在having子句中;
能用分组前筛选优先使用分组前筛选
2.group 支持多个字段分组,用逗号隔开,不区分先后,也支持表达式或者函数(用的少)3.也可以添加排序,放在最后
#引入
查询每个部门的平均工资:select avg from 表 groupby 部门
select department_id,AVG(salary)FROM employees GROUPBY department_id
案例1:查询每个工种的最高工资:select max from 表 groupby 工种
SELECTMAX(salary),job_id FROM employees GROUPBY job_id;
案例2:每个位置上的部门个数:selectcount(*)from 表 groupby 部门
SELECTCOUNT(*), location_id FROM departments GROUPBY location_id;
添加筛选条件
邮箱中包含a字符的每个部门的平均工资:select avg fromtablewhere email like'%a%'groupby 部门
SELECTAVG(salary)FROM employees WHERE email LIKE'%a%'GROUPBY department_id
2.有奖金的每个领导收下员工的最高工资
SELECTMAX(salary),manager_id FROM employees WHERE commission_pct ISNOTNULLGROUPBY manager_id;
添加复杂的筛选条件
案例1:查询哪个部门的员工数大于2--->先分组再筛选SELECTCOUNT(*),department_id FROM employees GROUPBY department_id HAVINGCOUNT(*)>2;
案例2:每个公众有奖金的员工的最高工资>12000的工种编号和最高工资
SELECTMAX(salary),job_id FROM employees WHERE commission_pct ISNOTNULLGROUPBY job_id HAVINGMAX(salary)>12000;
案例3:领导编号大于102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECTMIN(salary),manager_id FROM employees WHERE manager_id >102GROUPBY manager_id HAVINGMIN(salary)>5000;
按表达式分组
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些
SELECTCOUNT(*)FROM employees GROUPBY LENGTH(CONCAT(`last_name`,`first_name`))HAVINGCOUNT(*)>5
按多个字段分组
每个部门每个gongzhong的员工平均工资--->多个字段放在GROUP BY 后面SELECTAVG(salary),department_id FROM employees GROUPBY department_id,job_id
添加排序
每个部门每个公众的员工平均工资,按平均工资高低显示
SELECTAVG(salary),department_id,job_id FROM employees GROUPBY department_id,job_id ORDERBYAVG(salary)DESC