LeetCode:編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary)

題目描述:
編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。

±—±-------+
| Id | Salary |
±—±-------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
±—±-------+
例如上述 Employee 表,SQL查詢應該返回 200 作爲第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。

±--------------------+
| SecondHighestSalary |
±--------------------+
| 200 |
±--------------------+

Oracle解法:

select salary SECONDHIGHESTSALARY from (
    select rownum as numSa,salary from employee order by salary desc
) where numSa='2'

Oracle查詢不到結果返回值即爲空,但是LeetCode會判錯,這是bug,無須在意

**Mysql解法1:**將不同的薪資按降序排序,然後使用 LIMIT 子句獲得第二高的薪資,然而,如果沒有這樣的第二最高工資,這個解決方案將被判斷爲 “錯誤答案”,因爲本表可能只有一項記錄。爲了克服這個問題,我們可以將其作爲臨時表。

  SELECT
        (SELECT DISTINCT
                Salary
            FROM
                Employee
            ORDER BY Salary DESC
            LIMIT 1 OFFSET 1) AS SecondHighestSalary
    ;

**Mysql解法2:**解決 “NULL” 問題的另一種方法是使用 “IFNULL” 函數

SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary

知識點:Mysql limit offset 用法

語句1:select * from student limit 9,4
語句2:slect * from student limit 4 offset 9
// 語句1和2均返回表student的第10、11、12、13行
//語句2中的4表示返回4行,9表示從表的第十行開始

通過limit和offset 或只通過limit可以實現分頁功能。
假設 numberperpage 表示每頁要顯示的條數,pagenumber表示頁碼,那麼 返回第pagenumber頁,每頁條數爲numberperpage的sql語句:

代碼示例:
語句3:select * from studnet limit (pagenumber-1)*numberperpage,numberperpage
語句4:select * from student limit numberperpage offset (pagenumber-1)*numberperpage

參考:
https://blog.csdn.net/l1212xiao/article/details/80520330
https://leetcode-cn.com/problems/second-highest-salary/

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