以下是针对这段完整可运行的官方代码,逐行拆解的核心知识点,覆盖语法规则、逻辑设计、易错点,形成体系化的知识点把控:
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 | 函数体的边界标识,所有逻辑必须包裹在 BEGIN 和 END 之间 | 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,行数 = 1 | 1. 偏移量从 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 列 |