1. 程式人生 > >【LeetCode--資料庫】工資問題

【LeetCode--資料庫】工資問題

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;