LeetCode-176-第二高的薪水
LeetCode for SQL的第二题
题目的具体描述如下:
答案
方法1
方法1思路:第二高的薪水,也就是除去最高薪水之后,在剩下的薪水中最高(自己方法);
1 | select |
缺点:当求第二高薪水的时候,只需要嵌套一层;如果求的是第3高,那么需要将第一高、第二高的同时排除,需要排除两次
1 | select |
方法2
使用 limit 关键字来实现翻页处理,limit 的使用方法:假设现有一张 Student 表,表中全部数据如下:
1 | mysql> select * from Student; |
1、使用limit m,n的形式:m 表示从第 m 行数据之后,不包含第 m 行,之后的 n 行数据:
1 | mysql> select * from Student limit 2, 3; -- 第2行之后(不包含2)的3行数据 |
2、使用limit m offset n形式:表示查询结果跳过 n 条数据,读取前 m 条数据
1 | mysql> select * from Student limit 3 offset 2; -- 效果同上 |
介绍完 limit 的使用之后,我们用其来实现本题中的需求:
1 | select |
如果原数据中只存在一个最高值,也就说不存在第二高薪水的时候,需要显示为null,我们对上面的结果使用ifnull函数来实现:
1 | select ifnull((select distinct Salary -- 如果不存在则赋值为null |
求出第n高的成绩
现在将上面的题目进行扩展,假设有两张表:Score和Course,通过字段 c_id 可以进行关联。
现在有一个需求:找出语文科目第2高的成绩和学号。
1 | mysql> select * from Score; -- 成绩表Score:学号s_id、课程号c_id、成绩s_score |
1 | mysql> select * from Course; -- 课程表:课程号c_id,课程名c_name,教师编号t_id |
将两张表关联起来,可以看到下面的结果,我们发现语文科目中最高的是80,第二高的是76,这就是我们想要的结果。
1 | select |
1 | select |