MySQL使用变量进行分组排序

本文介绍了如何使用MySQL变量进行分组排序,以找出每个部门年龄最大的男性和女性员工。通过创建员工表并插入数据,然后利用变量@rank、@department和@sex进行排序和分组,实现对每个部门内员工按性别和年龄的排序。最终通过条件a.rank=1筛选出每个部门年龄最大的员工信息。

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

一、MySQL使用变量进行分组排序

1.新建员工表并插入测试数据

create table employee(
id int(11) not null auto_increment primary key,
name varchar(32) default null comment '员工姓名',
sex varchar(8) default null comment '员工性别',
age int(11) default null comment '员工年龄',
department varchar(64) default null comment '员工部门'
) comment = '员工表';
insert into employee(name, sex, age, department)
values
('张一', '男', 25, '一号部门'),
('李一', '男', 35, '二号部门'),
('王一', '男', 28, '三号部门'),
('张二', '男', 18, '一号部门'),
('张三', '女', 36, '一号部门'),
('张七', '女', 31, '一号部门'),
('李二', '男', 21, '二号部门'),
('王二', '男', 27, '三号部门'),
('李三', '女', 25, '二号部门'),
('李五', '女', 29, '二号部门'),
('王三', '女', 25, '三号部门'),
('王五', '女', 32, '三号部门'),
('王四', '女', 26, '三号部门');

2.创建后的表结构如下图
在这里插入图片描述
3.目标:找出每个部门年龄最大的男性员工和女性员工的信息
实现SQL如下:

select a.id, a.name, a.sex, a.age, a.department, a.rank
from(
	select id, name, sex, age, department,
   	if(@department=a.department and @sex=a.sex, @rank:=@rank+1, @rank:=1) as rank,@department:=a.department, @sex:=a.sex
    from(
		select id, name, sex, age, department
		from employee
		order by department, sex, age desc
		)a,
	    (
        select @rank:=0, @department:=null, @sex:=null
		)b
	) a
where a.rank = 1
order by a.id

4.SQL解析
4.1 分组排序顾名思义就是先分组后排序,只不过是分组不再使用 group by 了;
4.2 SQL 解析

select id, name, sex, age, department
from employee
order by department, sex, age desc

首先将员工信息全部查询出来,然后根据部门,性别,年龄进行排序,这样不仅实现了单一的排序,而且对数据进行了分组,将部门相同,性别相同的信息排到了一起,并且是按照年龄进行降序排列的,这时查询出的数据如图:
在这里插入图片描述
这样,我们只需要将每个部门年龄最大的男性和女性员工信息提取出来就可以了。

(
   select @rank:=0, @department:=null, @sex:=null
)b

该行 SQL 只是用来简单的定义三个变量,@rank 用来记录序号, @department 用来记录下一个员工的部门, @sex 用来记录下一个员工的性别,如果你的需求需要更多的变量,继续添加即可,另如果不理解变量的定义,请查询 MySQL 变量。
使用变量分组排序的关键点是如下 SQL:

if(@department=a.department and @sex=a.sex, @rank:=@rank+1, @rank:=1) as rank,@department:=a.department, @sex:=a.sex

当第一条数据进来时,由于 @department=null,@sex=null,所以条件不成立,那么 @rank=1,
然后将该条数据的部门,性别赋给 @department, @sex,这样第二条数据进来时如果部门和性别与上一条数据的部门和性别相等,那么 @rank=2,当第三条数据进来时,部门和性别与第二条的不同,说明一个新的部门和性别出现了,那么 @rank=1,就这样执行下去,每一个部门里的男性员工和女性员工不仅区分开了,而且也各自排好顺序了,加上最后的条件

where a.rank = 1

就将每个部门年龄最大的男性员工和女性员工取出来了,因为年龄我们是按照降序排列的,所以最终结果的第一条就是我们需要的数据,同理,我们也可以出去前两条,前十条等,最终的执行结果为:
在这里插入图片描述
至此,使用变量进行分组排序结束。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值