关键词:排序,limit,ifnull函数,max函数,临时表
2022年12月2日
题目:
编写一个 SQL 查询,获取并返回 Employee
表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null
Employee表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。
1.方法一
查找出小于最大的数据中最大的
select max(salary) as SecondHighestSalary
from Employee
where salary < (select max(salary) from Employee )
2.方法二
limit用法:
1、当 limit后面跟一个参数的时候,该参数表示要取的数据的数量
例如 select* from user limit 3 表示直接取前三条数据
2、当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量,例如
select * from user limit 1,3;
就是跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据
3、当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。
例如select * from user limit 3 offset 1;表示跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据
select distinct salary as SecondHighestSalary
from Employee
order by salary desc
limit 1 offset 1
但这种方法会导致如果没有第二大的数据(比如只有一条数据的表)查询返回就不为null
所以加以改进采用临时表的方式
select
(
select distinct salary
from Employee
order by salary desc
limit 1 offset 1
) as SecondHighestSalary
3 .方法三
对方法二中返回不为null
的情况的解决
采用ifnull
控制语句
select
ifnull(
(select distinct salary
from Employee
order by salary desc
limit 1 offset 1),
null
) as SecondHighestSalary
IFNULL(expr1,expr2)的用法:
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。
IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
例:
mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,'yes');