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

MySQL 第 N 高薪水查詢:LIMIT 偏移量與存儲函數實現

     編輯:MySQL 綜合教學

題目描述

編寫 SQL 查詢獲取 Employee 表第 N 高薪水。不存在時返回 NULL。

示例數據

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

N=2 時返回 200。

解法一:存儲函數(兼容舊版本)

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    DECLARE M INT;
    SET M = N - 1;
    RETURN (
        SELECT DISTINCT Salary
        FROM Employee
        ORDER BY Salary DESC
        LIMIT M, 1
    );
END

原理:去重後降序,LIMIT offset, 1 取第 offset+1 行。N=1 → offset=0 取最高;N=2 → offset=1 取第二高。

解法二:MySQL 8.0+ 窗口函數(推薦)

SELECT DISTINCT Salary
FROM (
    SELECT Salary,
           DENSE_RANK() OVER (ORDER BY Salary DESC) AS rnk
    FROM Employee
) t
WHERE rnk = N
LIMIT 1;

DENSE_RANK 完美處理並列薪水(如 300,300,200 → 排名 1,1,2),無間隔。

解法三:子查詢計數(通用)

SELECT DISTINCT Salary
FROM Employee e1
WHERE N = (
    SELECT COUNT(DISTINCT Salary)
    FROM Employee e2
    WHERE e2.Salary >= e1.Salary
);

統計有多少不同薪水 ≥ 當前薪水,等於 N 即為第 N 高。

邊界處理

  • N ≤ 0 或 N > 不同薪水數 → 返回 NULL(函數自動返回 NULL)
  • 大表建議加索引:INDEX (Salary DESC)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved