关于N176第二高薪水
SQL窗口函数相关
1. OVER关键字
OVER是窗口函数的核心,定义计算范围- 语法:
窗口函数() OVER (窗口定义) - 可包含
PARTITION BY、ORDER BY、窗口框架
2. 窗口函数类型
- 官方内置:
RANK(),DENSE_RANK(),ROW_NUMBER()等 - 聚合函数:
SUM(),AVG()等加上OVER也可作为窗口函数 - 用户自定义:存在但很少使用
MySQL语法规则
3. 保留关键字处理
rank是MySQL保留字,用作别名需加反引号`rank`- 或避免使用保留字作为标识符
4. 派生表别名
- 每个子查询(派生表)必须有别名
- 语法:
(SELECT ...) AS alias_name
NULL值处理
5. 空结果集 vs NULL值
- 空结果集(0行)≠ NULL值
IFNULL()只能处理NULL值,不能处理空结果集
6. 标量子查询
- 用括号包围:
SELECT (子查询) AS column - 只能返回一行一列
- 关键特性:空结果集自动转换为NULL
- 这是处理"不存在记录时返回NULL"的标准方法
实际应用
7. 第N高问题的解决方案
-- 方案1:LIMIT + OFFSET(推荐)
SELECT (SELECT DISTINCT salary FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary;
-- 方案2:窗口函数 + 标量子查询
SELECT (SELECT salary FROM (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rk FROM employee) t WHERE rk = 2 LIMIT 1) AS SecondHighestSalary;
这些知识点在处理排名、分析类SQL问题时非常实用!

浙公网安备 33010602011771号