mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询

本文详细介绍了SQL分组查询的应用技巧,包括基本语法、不同场景下的案例演示以及复杂条件筛选等高级应用。通过具体实例展示了如何利用GROUP BY进行数据聚合分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#进阶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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值