- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
描述
编写一个 SQL 语句,获取球员 (players) 表中第二高的身高 (height)
表定义: players (球员表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int unsigned | 主键 |
| height | int | 球员身高 |
**
注意输出结果的列名为:second_height
样例
样例一:
表内容: players
| id | height |
|---|---|
| 1 | 198 |
| 2 | 226 |
| 3 | 200 |
| 4 | 226 |
如上述球员 (players) 表,SQL 查询应该返回 200 作为第二高的身高。如果不存在第二高的身高,那么查询应该返回 null
| second_height |
|---|
| 200 |
样例二:
表内容: players
| id | height |
|---|---|
| 1 | 198 |
| 2 | 198 |
| 3 | 198 |
如上述球员 (players) 表,SQL 查询应该返回 null
| second_height |
|---|
| null |
题解
解法1
首先找到身高最大值,然后再根据身高最大值,找到身高第二大的值。
使用max函数,先找到最大值,然后挑选出所有小于最大值的数,再次使用max找到第二大的值。
select max(height) as second_height from players
where height < (select max(p1.height) from players p1);
这个使用了not in (!=)找到其他的高度值,然后在剩下的高度值中,找到第二大的高度值。
select max(height) second_height from players where height not in (select max(height) from players );
解法2
这个解法主要是分页的思想,首先按照身高之进行排序,然后使用limit和offset找到第二个。
select (select distinct height second_height from players
order by height desc
limit 1
offset 1) as second_height
解法3
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL() 函数语法格式为:
select ifnull((
select distinct height from players order by height desc limit 1,1),null)
as second_height;