(1)第二高薪水
編寫一個 SQL 查詢,獲取 Employee
表中第二高的薪水(Salary)
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee
表,SQL查詢應該返回 200
作為第二高的薪水。如果不存在第二高的薪水,那么查詢應返回 null
。
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
剛一看題目,覺得很簡單的,可是做了一下之后才發現很多細節都沒考慮,特此記錄下來
select (select distinct Salary from Employee order by Salary desc limit 1,1)as SecondHighestSalary
或
select (select distinct Salary from Employee order by Salary desc limit 1 offset 1)as SecondHighestSalary
limit限制結果范圍
SELECT * FROM Employee LIMIT 0,1; SELECT * FROM Employee LIMIT 1 OFFSET 0; SELECT * FROM products LIMIT 1;
“0”: 代表數據獲取的起始位置.(0代表第一條記錄,以此遞增)
“1”: 期望獲取的記錄條數.
當獲取的記錄是從第一條開始則可以省略書寫起始位置 “0”
(2)部門工資最高的員工
Employee
表包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | +----+-------+--------+--------------+
Department
表包含公司所有部門的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | Sales | Henry | 80000 | +------------+----------+--------+
SELECT d. NAME AS Department,e. NAME AS Employee,e.Salary FROM Department d,Employee e
WHERE d.Id = e.DepartmentId AND (e.Salary, e.DepartmentId) IN (SELECT Max(Salary),DepartmentId FROM Employee GROUP BY DepartmentId)
(3)部門工資前三高的員工
Employee
表包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id 。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | +----+-------+--------+--------------+
Department
表包含公司所有部門的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
編寫一個 SQL 查詢,找出每個部門工資前三高的員工。例如,根據上述給定的表格,查詢結果應返回:
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Randy | 85000 | | IT | Joe | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+
select d.Name as Department,e.Name Employee,e.Salary from Employee e,Department d where e.DepartmentId=d.Id and Salary>=IFNULL((select distinct e1.Salary from Employee as e1 where e.DepartmentId=e1.DepartmentId order by e1.Salary desc limit 2,1),0) order by DepartmentId,Salary desc;
說明:
IFNULL(expression_1,expression_2);
如果expression_1
不為NULL
,則IFNULL
函數返回expression_1
; 否則返回expression_2
的結果