一、题目
Employee 表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
查询结果如下例所示。
示例 1:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
示例 2:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null |
+---------------------+
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/se…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
创建数据表
根据题意创建数据表,并设置主键
CREATE TABLE Employee(
id INT PRIMARY KEY,
salary INT
);
INSERT INTO Employee VALUES
(1,100),
(2,200),
(3,300);
思路
- 将数据降序,第一个数据就可以得到最高的数据,然后偏移一个数据,就得到第二高的薪水
- 进行为空判断,如果没有第二高的薪水,就返回为null
第一种SELECT嵌套并去除得到数据集,并设置假名
SELECT (
SELECT DISTINCT
salary SecondHighestSalary
FROM
Employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1
)
AS SecondHighestSalary
第二种通过IFNULL判断来处理没有第二高的薪水的情况
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
- 展示结果
三、执行语句
SELECT语句
IFNULL
四、总结
SELECT嵌套查询
SELECT的嵌套查询
- 可以作为查询条件,使用 [条件]=(SELECT * FROM ....)
- 可以与in在一起使用 [字段] in (SELECT * FROM ....)
- exits嵌套查询:where exists (SELECT * FROM ....), 如果子集没有头结果返回,主句就不执行,返回true和false.
IFNULL
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
语法:
IFNULL(expression, alt_value)
limit
// rows 代表行数,等价于limit 0, rows
limit rows
// offset代表偏移量,相当于数据往后偏移了一位
limit rows offset 1