MySQL查询语句之分组查询(四)

文章目录

    • 简单分组
            • 案例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; # 排序放在最后

你可能感兴趣的:(MySQL查询语句之分组查询(四))