【LeetCode--資料庫】工資問題
阿新 • • 發佈:2019-01-08
627. 交換工資(簡單)
題目:給定一個salary 表,如下所示,有m=男性 和 f=女性的值 。交換所有的 f 和 m 值(例如,將所有 f 值更改為 m,反之亦然)。要求使用一個更新查詢,並且沒有中間臨時表
| id | name | sex | salary |
|----|------|-----|--------|
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
期望結果:
| id | name | sex | salary | |----|------|-----|--------| | 1 | A | f | 2500 | | 2 | B | m | 1500 | | 3 | C | f | 5500 | | 4 | D | m | 500 |
解法:使用if函式
update salary
set sex = if(sex='m','f','m');
184. 部門工資最高的員工(中等)
題目:Employee
表包含所有員工資訊,每個員工有其對應的 Id, salary 和 department Id;Department
表包含公司所有部門的資訊;編寫一個 SQL 查詢,找出每個部門工資最高的員工。
+----+-------+--------+--------------+ +-------+--------+ | Id | Name | Salary | DepartmentId | | Id | Name | +----+-------+--------+--------------+ +-------+--------+ | 1 | Joe | 70000 | 1 | | 1 | IT | | 2 | Henry | 80000 | 2 | | 2 | Sales | | 3 | Sam | 60000 | 2 | +-------+--------+ | 4 | Max | 90000 | 1 | +----+-------+--------+--------------+
期望結果:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
解法:連線兩個表,where子句按部門id分組查詢最高的工資,再通過部門id找到對應部門名字
select d.Name as Department,e.Name as Employee,e.Salary from Employee as e join Department as d on e.DepartmentId = d.Id where (e.Salary,e.DepartmentId) in(select max(Salary),DepartmentId from Employee group by DepartmentId);
185. 部門工資前三高的員工(困難)
題目:Employee
表包含所有員工資訊,每個員工有其對應的 Id, salary 和 department Id ;Department
表包含公司所有部門的資訊;編寫一個 SQL 查詢,找出每個部門工資前三高的員工
+----+-------+--------+--------------+ +-----+-------+
| Id | Name | Salary | DepartmentId | | Id | Name |
+----+-------+--------+--------------+ +-----+-------+
| 1 | Joe | 70000 | 1 | | 1 | IT |
| 2 | Henry | 80000 | 2 | | 2 | Sales |
| 3 | Sam | 60000 | 2 | +-----+-------+
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
+----+-------+--------+--------------+
期望結果:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Randy | 85000 |
| IT | Joe | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
+------------+----------+--------+
解法:連線兩個表,
where子句的意思是,在該部門中比這三名員工工資高的不超過3人
SELECT d.Name AS Department, e1.Name AS Employee, e1.Salary
FROM Employee e1 JOIN Department d ON e1.DepartmentId = d.Id
WHERE (SELECT COUNT(DISTINCT e2.Salary) FROM Employee e2
WHERE e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId) < 3;