難受,本以爲熟悉了常見的sql語句後刷題沒啥問題,今天力扣怒刷20題,還是不行。正確率還是達不到想要的水平。一個初級後端程序員還是要兼具初級數據庫管理員的大旗,奮鬥在一線數據庫維護中。以後本篇長期更新在數據庫刷題中做錯的題,以及分析解決思路。
習題一:
編寫一個 SQL 查詢,獲取 Employee
表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee
表,SQL查詢應該返回 200
作爲第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null
。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
題解:
我們正常的思路是在排除最大的裏面找最大,即爲第二大。
select max(Salary) as SecondHighestSalary
from Employee
where Salary<(select max(Salary)from Employee);
但是我們舉一反三的想一想,如果我們要查的是第三或者第四大的時候怎麼辦,我們按上面的嵌套的方法就明顯的不適用了;
所以我們要換一種思路,用上排序和分頁。
高,DESC 排序
LIMIT 位移偏移量加以限制
如果沒有值,則返回 null,可以通過臨時表或者IFNULL
select ifnull(
(
select Salary from Employee
order by Salary desc
limit 1,1
),null
) as SecondHighestSalary ;
以上方法,就很完美的解決了這個問題。如果有更好的思路,歡迎各位大佬指教,謝謝。