「第二高薪水」的通用化扩展版,核心是掌握「第 N 高」问题的通用解法

0 阅读2分钟

以下是针对这段完整可运行的官方代码,逐行拆解的核心知识点,覆盖语法规则、逻辑设计、易错点,形成体系化的知识点把控:

sql

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

一、基础语法层(MySQL 存储函数核心规则)

表格

代码片段核心知识点易错点 / 注意事项
CREATE FUNCTION ...1. 自定义存储函数的创建语法:CREATE FUNCTION 函数名(参数 类型) RETURNS 返回类型2. 函数参数:N INT 为输入参数,类型为整数函数名不能与内置函数重名;返回类型需与实际返回值类型匹配(如薪水为 INT 则 RETURNS INT)
BEGIN ... END函数体的边界标识,所有逻辑必须包裹在 BEGINEND 之间DECLARE 变量声明必须放在 BEGIN 后、其他逻辑前(否则报语法错误)
DECLARE M INT;局部变量声明语法:DECLARE 变量名 类型;变量作用域仅限函数体内,需先声明后使用
SET M = N-1;变量赋值语法:SET 变量名 = 表达式;赋值符号是 =,而非 :=(MySQL 中 SET 语句用 =,SELECT 赋值用 :=
RETURN (...)函数返回值语法:RETURN (查询语句/值)返回值必须与 RETURNS 声明的类型一致;括号内为单个值(子查询需确保只返回 1 行 1 列)

二、业务逻辑层(「第 N 高薪水」核心逻辑)

表格

代码片段核心知识点业务意义
SELECT DISTINCT salary去重关键字 DISTINCT:过滤重复的薪水值满足题目「不同薪水」的要求(如两条 20000 薪水记录,去重后仅算一个排名)
ORDER BY salary DESC排序语法:ORDER BY 字段 DESC/ASC(DESC 降序,ASC 升序,默认 ASC)降序排列后,薪水从高到低,才能通过 LIMIT 取第 N 高
LIMIT M, 1分页语法:LIMIT 偏移量, 行数偏移量 = N-1,行数 = 11. 偏移量从 0 开始(第 1 高偏移量 0,第 2 高偏移量 1,以此类推)2. LIMIT 仅支持常量 / 变量,不支持直接写 N-1

三、语法限制层(MySQL 关键语法约束)

表格

限制点具体规则解决方案(对应代码)
LIMIT 参数限制LIMIT 后的偏移量 / 行数不能直接写表达式(如 LIMIT N-1, 1 报错)先通过变量 M 计算 N-1,再用 LIMIT M, 1
子查询返回值限制RETURN 要求子查询必须返回单行单列LIMIT 1 确保只返回 1 行;SELECT salary 确保只返回 1 列