小赖子的英国生活和资讯

软件工程师数据库面试技巧之 SQL中的第二名记录

阅读 桌面完整版

现在最吃香的工程师是 全栈工程师 (Full Stack), 因此你除了要好的算法数据结构知识外 你还需要懂数据库等计算机知识. 有人说, SQL好简单, 其实SQL也可以考考你的逻辑, 比如有这么一个简单的 (含有两个字段, 三行记录) 的关系表 (假设表名为 Employee).

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

请输出第二高的记录, 也就是 ID = 2, Salary = 200.

如果不存在第二高, 比如 两条记录都是 100, 100, 那么应该返回 null. 而 100, 100, 90 应该返回90而不是100. 这样的话:

1
select * from Employee order by salary desc limit 1,1
select * from Employee order by salary desc limit 1,1

就不对了. 你也可以用 group by:

1
select Salary as SecondHighestSalary from Employee group by Salary order by Salary limit 1,1 
select Salary as SecondHighestSalary from Employee group by Salary order by Salary limit 1,1 

但是当第二高记录不存在时, 该SQL返回空而不是 null.

Input: {"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100]]}}
Output: {"headers": ["SecondHighestSalary"], "values": []}
Expected: {"headers": ["SecondHighestSalary"], "values": [[null]]}

SQL中有 max, min, 但这些都无法直接输出第二高(或者第二低), 但你可以这么想, 我取得了最高的, 剩下的取最高就是第二高了, 是不是很简单?

Select max(Salary)
from Employee
where Salary < (select max(Salary) from Employee)

上面黑体的是子查询 先返回最大的记录为 300, 那么接下来意思就很明白了, 比最大值300小的最大值是多少? 200嘛.

PS: 当年我招程序员的面试的时候 就拿了这一题作为第一题 (45分钟考卷, 10题左右, 这题是送分题)

SQL programming

英文: SQL Coding Exercise – Second Highest Salary

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version