MySQL分组查询

    科技2023-09-28  79

    语法: select 分组函数,列(要求出现在group by的后面) from 表名 [where 筛选条件] group by分组的列表 [order by子句]

    注意:查询列表比较特殊,要求是分组函数和group by后出现的字段 一、分组前加筛选条件 案例1:查询每个工种的最高工资

    select max(salary),job_id from employees group by job_id;

    案例2:查询每个位置上的部门个数

    select count(*),location_id from employees group by location_id;

    案例3:查询邮箱中包含a字符的,每个部门的平均工资

    select avg(salary),department_id from employees where eamil like '%a%' group by department_id;

    案例4:查询有奖金的每个领到手下员工的最高工资

    select max(salary),manager_id from employees where commision is not null group by manager_id;

    二、分组后加筛选条件 案例1:查询哪个部门的员工个数>2

    select count(*),department_id from employees group by department_id having count(*)>2;

    案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

    select job_id,max(salary) from employees where commision is not null group by job_id having max(salary)>12000;

    案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资

    select manager_id,min(salary) from employees where manager_id>102 group by manager_id having min(salary)>5000;

    三、分组前后筛选的区别

    数据源位置关键字分组前筛选原始表group by子句的前面where分组后筛选分组后的结果集group by子句的后面having

    大招:分组函数作为条件 肯定是放在having子句中,因为分组函数本身就是在原始表的基础上查询出的一个结果集

    考虑到查询性能的原因,如果能放在分组前筛选的就优先放在分组前筛选。

    四、按表达式或函数分组 案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些

    select length(last_name),count(*) from employees group by length(last_name) having count(*)>5;

    where后面不支持别名,group by和having都支持别名

    案例2:查询每个部门每个工种的员工的平均工资

    select avg(salary),department_id,job_id from employees group by department_id,job_id;

    添加排序 案例3:查询每个部门每个工种的平均工资,并且按平均工资的高低显示

    select avg(salary),department_id,job_id from employees group by department_id,job_id order by avg(salary) desc;

    group by子句支持多个字段分组(多个字段之间用逗号隔开,没有顺序要求),还支持表达式和分组函数(用的较少)

    Processed: 0.008, SQL: 8