mysql查詢部門工資前三的信息

兩個表,一個部門表Department

一個Employee表

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

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;  

查詢結果

第二種(如果有多名並列第三,把所有第三名也展示出來)

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;

查詢結果:

逐步分析第一種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   

查詢出第一個所有薪資低於第二個的情況

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  

結果

找出三條記錄

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  

結果

按部門正序,薪資倒序排序

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;  

結果

附建表語句:

-- ----------------------------
-- 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');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章