题目:
Employee 表:
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ id 是这个表的主键。 表的每一行包含员工的工资信息。
查询并返回 Employee 表中第二高的 不同 薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。
查询结果如下例所示。
示例 1:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
示例 2:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | null | +---------------------+
法1:
思路:先找出salary中的最大值,再用过滤的方法把最大值过滤掉,再取最大值
SELECT MAX(SALARY) AS SecondHighestSalary
FROM EMPLOYEE
WHERE SALARY < (SELECT MAX(SALARY) FROM EMPLOYEE)
#在WHERE条件中使用子查询时,子查询必须用括号括起来
逻辑分解:
1.子查询部分(SELECT MAX(salary) FROM Employee)先执行,找出表中最高工资
2.主查询WHERE条件,过滤出小于最大薪资的值,如果只有一条数据,将会过滤掉所有记录,主查询也就是在空的集合上操作,所以返回null
3.主查询SELECT,在过滤后的记录中找出最大值,就是第二高工资。
方法2:使用IFNULL和LIMIT子句
IFNULL(A,B)指的是如果A为NULL时返回B
思路:先查询不重复的SALARY,然后对其逆向排序,再取排序后的第二个数并命名为
SecondHighestSalary,使用IFNULL,当查询是空的时候返回NULL
SELECT
IFNULL(
(SELECT DISTINCT SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC
LIMIT 1 OFFSET 1
),NULL
) AS SecondHighestSalary
方法三
构建临时表以满足结果为NULL
使用子查询作为临时表会返回NULL,如果直接查询,会返回空结果集,但如果把子查询作为临时表,当子查询不返回任何行时,未曾的SELECT会将其视为NULL值,这种特性在实际应用中很重要。
SELECT(
SELECT DISTINCT SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC
LIMI 1 OFFSET 1
) AS SecondHighestSalary
286

被折叠的 条评论
为什么被折叠?



