文章目录
- 简单分组
- 案例1:查询某个工种(job_id)的最高工资
- 案例2:查询某个位置上的部门个数
- 添加分组后的筛选条件
- 案例1:查询邮箱中包含a字符的,某个部门平均工资
- 案例2:查询有奖金的每个领导手下的员工最高工资
- 添加复杂的筛选条件
- 案例1:查询哪个部门的员工个数>2
- 案例2:查询每个工种有奖金的员工最高工资大于12000的工种编号和最高工资
- 案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个以及其最低工资
- 按表达式或函数分组
- 案例:按员工姓名长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些
- 按多个字段分组
- 案例:查询每个部门每个工种的员工平均工资
- 添加排序
- 案例:查询每个部门每个工种的员工平均工资,并且按工资高低排序
引入: 查询每个部门的平均工资?
语法:select 分组函数,列(要求出现在group by的后面) from 表名 [where 筛选条件] group by 分组的列表 [order by 字句]
注意:
查询列表必须特殊,要求是分组函数和group by
后面出现的字段
特点:
1.分组查询中的筛选条件分为两类,数据源不一样
分组前筛选
:原始表,位置放在group by
子句前,where
连接
分组后筛选
:分组后的结果集,位置在group by
子句后,having
连接
①分组函数做条件肯定放在having
子句中
②能用分组前筛选的,优先考虑使用分组前筛选
2.group by
子句支持单个字段分组,多个字段分组,逗号隔开无顺序要求,表达式或函数(使用少)
3.也可以添加排序(排序放在整个分组查询最后)
简单分组
案例1:查询某个工种(job_id)的最高工资
select max(salary),job_id from employees group by job_id;
案例2:查询某个位置上的部门个数
select count(*),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
step1. 查询每个部门的员工个数
step2. 根据step1的结果进行筛选,查询哪个部门员工个数大于2
select count(*),department_id
from employees
group by department_id
having count(*)>2; # 分组后筛选,使用having
案例2:查询每个工种有奖金的员工最高工资大于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的领导编号是哪个以及其最低工资
select min(salary),manager_id
from employees
where manager_id>102
group by manager_id
having min(salary)>5000;
按表达式或函数分组
案例:按员工姓名长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些
select count(*),length(last_name) as len_name
from employees
group by length(last_name) # 按表达式或函数分组
having count(*)>5; # having后支持用别名,where不支持,order by也支持
按多个字段分组
案例:查询每个部门每个工种的员工平均工资
select avg(salary),department_id,job_id
from employees
group by department_id,job_id; # 多个字段分组。可调换位置
添加排序
案例:查询每个部门每个工种的员工平均工资,并且按工资高低排序
select avg(salary),department_id,job_id
from employees
where department_id is not null
group by department_id,job_id
having avg(salary)>10000
order by avg(salary) desc; # 排序放在最后