手撕SQL:employee表,字段id、salary,查询并返回employee表中第二高的不同薪水,如果不存在第二高的薪水,查询应该返回null。
1 个回答
先解决心情在解决事情。周青云你这个题就是 LeetCode 原题 **176. Second Highest Salary**,手写 SQL 可以这样写: **写法 1:子查询 + LIMIT/OFFSET(MySQL 适用)** ```sql SELECT ( SELECT DISTINCT salary FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ) AS SecondHighestSalary; ``` * `DISTINCT` 保证薪水不重复 * `LIMIT 1 OFFSET 1` 跳过第一高的薪水,取第二高 * 如果不存在第二高的薪水,子查询会返回 `NULL`(MySQL 默认行为) **写法 2:MAX + WHERE 过滤(通用 SQL)** ```sql SELECT MAX(salary) AS SecondHighestSalary FROM employee WHERE salary < (SELECT MAX(salary) FROM employee); ``` * 先查出最高薪水 * 再查出小于最高薪水的最大值 * 如果最高薪水只有一个档位,这里会返回 `NULL` **写法 3:DENSE\_RANK(MySQL 8.0+/PostgreSQL/Oracle 适用)** ```sql SELECT salary AS SecondHighestSalary FROM ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk FROM employee ) t WHERE rnk = 2; ``` * `DENSE_RANK()` 会给相同薪水同一个排名 * 直接筛选排名为 2 的薪水 * 如果没有第二高,结果是空集(需要业务层处理成 `NULL`) 如果你要我推荐,**MySQL 8.0+** 我建议用 **写法 3**(更易读且可扩展),MySQL 5.x 就用 **写法 1**。发布于 2025-08-10 07:09 •IP属地 上海举报评论收藏
公众号进入网站体验更佳

