mysql 存储过程实现查询每个部门工资前三的员工

准备工作:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `emp_info`;
CREATE TABLE `emp_info`  (
  `emp_id` int(11) NOT NULL COMMENT '员工id',
  `dept_id` int(11) NOT NULL COMMENT '部门id',
  `salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪水',
  PRIMARY KEY (`dept_id`, `emp_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

INSERT INTO `emp_info` VALUES (10001, 1, 3000.00);
INSERT INTO `emp_info` VALUES (10002, 1, 3100.00);
INSERT INTO `emp_info` VALUES (10003, 1, 3200.00);
INSERT INTO `emp_info` VALUES (10004, 1, 2500.00);
INSERT INTO `emp_info` VALUES (10005, 1, 2200.00);
INSERT INTO `emp_info` VALUES (20001, 2, 4100.00);
INSERT INTO `emp_info` VALUES (20002, 2, 4200.00);
INSERT INTO `emp_info` VALUES (20003, 2, 4300.00);
INSERT INTO `emp_info` VALUES (20004, 2, 4150.00);
INSERT INTO `emp_info` VALUES (30001, 3, 2300.00);

SET FOREIGN_KEY_CHECKS = 1;

 思路:很明显如果给定一个部门id,让大家查询该部门工资前三的员工信息只需要where+order by+limit就能实现了,但是要想返回多个部门的前三,感觉需要存储过程。先查询出所有的部门id,然后以此为条件多次查询。暂时只能查出多个结果集,没有汇合结果集,这个感觉还是后台处理比较简单...

delimiter $$
drop PROCEDURE if EXISTS deptSalaryTopThree;
create procedure deptSalaryTopThree()
BEGIN
declare deptId  int;

-- 定义游标,并将sql结果集赋值到游标中
declare deptIdList cursor for select distinct(dept_id) from emp_info;

 -- 循环赋初始值,声明当游标遍历完后将标志变量置成某个值,然后退出循环
 declare CONTINUE HANDLER for not found set deptId=null;

#打开游标,开始遍历
open deptIdList;
fetch deptIdList into deptId;
#循环判断
while (deptId is not null and deptId>0) do
		select * from emp_info where dept_id=deptId order by salary desc limit 3; 
  #赋值下一个游标
	FETCH deptIdList into deptId;
end while;
#关闭游标
CLOSE deptIdList;
end $$
delimiter ;

call deptSalaryTopThree();

结果展示:

原始表数据:

查询结果:


版权声明:本文为b13001216978原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。