mysql 部门工资_mysql查询部门工资前三的信息

这篇博客详细解析了如何使用MySQL查询每个部门工资前三的员工信息,包括两种不同的查询方法,一种处理并列第三的情况,另一种则展示所有第三名。通过实际的SQL语句和建表、插入数据的示例,展示了查询过程和结果。
摘要由CSDN通过智能技术生成

两个表,一个部门表Department

3cb86eab0f434913b492d75c5cf987d0.png

一个Employee表

3abebe482beab12c4483643646608261.png

第一种,(如果有多名并列第三,只展示前二)

SELECT

emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName

FROM

Employee emp ,Employee emp1, Department dep

WHERE

emp.salary <=emp1.salary

AND emp.departmentId = emp1.departmentId

AND emp.departmentId = dep.id

GROUP BY

dep.id ,emp.id,emp.name ,emp.salary,dep.name

HAVING COUNT(*)<=3

ORDER BY

emp.departmentId , emp.salary desc;

查询结果

b5904d97469459981c7929fae8430d68.png

第二种(如果有多名并列第三,把所有第三名也展示出来)

Select d.Name as Department, e.Name as Employee, e.Salary

from Department d, Employee e

where DepartmentId = d.Id and (

Select count(distinct Salary) From Employee where DepartmentId=d.Id and Salary > e.Salary

)<3

order by Department,e.Salary DESC;

查询结果:

5f9590bc777dbc18a42b704cf33f5085.png

逐步分析第一种sql的执行过程

SELECT

emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName

FROM

Employee emp ,Employee emp1, Department dep

WHERE

emp.salary <=emp1.salary

AND emp.departmentId = emp1.departmentId

AND emp.departmentId = dep.id

查询出第一个所有薪资低于第二个的情况

83382c9059e01045e3651c66ffb8cb6e.png

group聚合,把相同情况合并

SELECT

emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName

FROM

Employee emp ,Employee emp1, Department dep

WHERE

emp.salary <=emp1.salary

AND emp.departmentId = emp1.departmentId

AND emp.departmentId = dep.id

GROUP BY

dep.id ,emp.id,emp.name ,emp.salary,dep.name

结果

0291ee7d7fc753ff2ed6cfda863a7c82.png

找出三条记录

SELECT

emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName

FROM

Employee emp ,Employee emp1, Department dep

WHERE

emp.salary <=emp1.salary

AND emp.departmentId = emp1.departmentId

AND emp.departmentId = dep.id

GROUP BY

dep.id ,emp.id,emp.name ,emp.salary,dep.name

HAVING COUNT(*)<=3

结果

8ceeee104c4567e07f6dba3ad463dead.png

按部门正序,薪资倒序排序

SELECT

emp.id , emp.name ,emp.salary, dep.id as depId , dep.name as depName

FROM

Employee emp ,Employee emp1, Department dep

WHERE

emp.salary <=emp1.salary

AND emp.departmentId = emp1.departmentId

AND emp.departmentId = dep.id

GROUP BY

dep.id ,emp.id,emp.name ,emp.salary,dep.name

HAVING COUNT(*)<=3

ORDER BY

emp.departmentId , emp.salary desc;

结果

e56e5ecb17c8bec2e63f96d98d1c7d0b.png

附建表语句:

-- ----------------------------

-- Table structure for Department

-- ----------------------------

DROP TABLE IF EXISTS `Department`;

CREATE TABLE `Department` (

`Id` int(11) NOT NULL,

`Name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of Department

-- ----------------------------

INSERT INTO `Department` VALUES ('1', 'IT');

INSERT INTO `Department` VALUES ('2', 'Sales');

INSERT INTO `Department` VALUES ('3', 'free');

-- ----------------------------

-- Table structure for Employee

-- ----------------------------

DROP TABLE IF EXISTS `Employee`;

CREATE TABLE `Employee` (

`Id` int(11) NOT NULL AUTO_INCREMENT,

`Name` varchar(255) DEFAULT NULL,

`Salary` int(11) DEFAULT NULL,

`DepartmentId` int(11) DEFAULT NULL,

PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of Employee

-- ----------------------------

INSERT INTO `Employee` VALUES ('1', 'Joe', '70000', '1');

INSERT INTO `Employee` VALUES ('2', 'Henry', '80000', '2');

INSERT INTO `Employee` VALUES ('3', 'Sam', '60000', '2');

INSERT INTO `Employee` VALUES ('4', 'Max', '90000', '1');

INSERT INTO `Employee` VALUES ('5', 'Janet', '85000', '1');

INSERT INTO `Employee` VALUES ('6', 'Randy', '85000', '1');

INSERT INTO `Employee` VALUES ('7', 'hshs', '4000000', '1');

INSERT INTO `Employee` VALUES ('8', 'ces', '60000', '2');

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值