首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

LeetCode 176. 第二高薪資 MySQL 解法詳解

     編輯:MySQL 綜合教學

LeetCode 176: Second Highest Salary

題目描述

編寫 SQL 查詢獲取 Employee 表中第二高的薪資。若不存在第二高薪資(如所有薪資相同或僅有一條記錄),查詢應返回 NULL。

表結構


CREATE TABLE Employee (
    Id INT PRIMARY KEY,
    Salary INT
);

解題思路

  1. 先找到最高薪資:SELECT MAX(Salary) FROM Employee
  2. 再查找小於最高薪資中的最大值:SELECT MAX(Salary) FROM Employee WHERE Salary < (最高薪資)
  3. 子查詢自然處理「不存在」情況:無滿足條件行時 MAX() 返回 NULL

標準解法


SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee);

替代寫法對比

寫法SQL優缺點
子查詢(推薦)見上簡潔、標準 SQL、自動處理 NULL
LIMIT/OFFSETSELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1MySQL/PostgreSQL 專用、需包裝子查詢處理 NULL
窗口函數(8.0+)SELECT DISTINCT Salary FROM (SELECT Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) AS rk FROM Employee) t WHERE rk = 2通用性強、擴展性好、語法較複雜
自連接SELECT MAX(e1.Salary) FROM Employee e1 JOIN Employee e2 ON e1.Salary < e2.Salary直觀但效能較差、產生笛卡爾積

邊界情況測試


-- 測試數據 1:正常情況
INSERT INTO Employee VALUES (1, 100), (2, 200), (3, 300);
-- 結果:200

-- 測試數據 2:重複最高薪資
INSERT INTO Employee VALUES (1, 100), (2, 200), (3, 200);
-- 結果:100(第二高不同值)

-- 測試數據 3:單行/全同
INSERT INTO Employee VALUES (1, 100);
-- 結果:NULL

性能考量

  • 子查詢方案只需兩次全表掃描(或索引掃描),複雜度 O(n)
  • 確保 Salary 列有索引可進一步優化
  • 避免使用 ORDER BY ... LIMIT 在大表上無索引時的 filesort

面試延伸問題

  1. 第 N 高薪資怎麼查?(通用化 LIMIT 方案或窗口函數)
  2. 如何處理部門內第二高薪資?(加 PARTITION BY DepartmentId)
  3. 若要求返回完整員工記錄而非僅薪資?(連表或窗口函數)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved