176. 第二高的薪水

177 阅读2分钟

一、题目

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
  • 展示结果

image.png

三、执行语句

SELECT语句

image.png

IFNULL

image.png

四、总结

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