存储过程实现查询每个部门工资前三的员工"/>
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) doselect * 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();
结果展示:
原始表数据:
查询结果:
更多推荐
mysql 存储过程实现查询每个部门工资前三的员工
发布评论