LeetCode176: 第二高的薪水

一、题目描述

SQL架构

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

二、解题思路

  1. 需要排除重复的值
  2. 再排个序
  3. 选出第二个
  4. 注意只有一个数据的情况

三、我的代码

# Write your MySQL query statement below
SELECT
    (SELECT DISTINCT
        Salary
    FROM
        Employee
    ORDER BY 
        Salary 
    DESC
    LIMIT 1 OFFSET 1)
AS 
SecondHighestSalary
;

/*法二
SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) 
AS SecondHighestSalary;
*/

四、相关知识

SQL SELECT DISTINCT 语句

在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。DISTINCT 关键词用于返回唯一不同的值。

语法:

SELECT DISTINCT 
	column_name
FROM table_name;
SQL ORDER BY 关键字

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。

ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

语法:

SELECT 
column_name1,column_name2
FROM table_name
ORDER BY 
column_name1,column_name2 
ASC|DESC;
SQL LIMIT子句

要检索查询返回的行的一部分,请使用LIMITOFFSET子句。 以下说明了这些子句的语法:

SELECT 
    column_list
FROM
    table1
ORDER BY 
	column_list
LIMIT row_count OFFSET offsetColumnNumber;

在这个语法中,

row_count确定将返回的行数。

OFFSET子句在开始返回行之前跳过偏移行。 OFFSET子句是可选的。 如果同时使用LIMITOFFSET子句,OFFSET会在LIMIT约束行数之前先跳过偏移行。

SQL SELECT ……AS……语句

as 可理解为:用作、当成,作为;一般是重命名列名或者表名。

1.例如有表table, 列 column_1,column_2

你可以写成

select  column_1  as  列1, column_2 as  列2   from  table  as  表

上面的语句就可以解释为,选择 column_1 作为列1,column_2 作为列2 , 把 table 当成表

SELECT * FROM Employee AS emp

这句意思是查找所有Employee 表里面的数据,并把Employee表格命名为 emp。
当你命名一个表之后,你可以在下面用 emp 代替 Employee.
例如 SELECT * FROM emp.

3.把查询对像起个别名的作用。

select ID as 用户ID,Name as 用户名 from Table_user
MySQL IFNULL() 函数

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

IFNULL() 函数语法格式为:

IFNULL(expression, alt_value)

如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。

参数说明:

参数 描述
expression 必须,要测试的值
alt_value 必须,expression 表达式为 NULL 时返回的值
SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
;//若Salary只有一个值,则为NULL,SecondHighestSalary的值不存在,也不为空

为空时,正确结果应为:(null)

posted @ 2021-01-05 23:07  东南亚季风  阅读(66)  评论(0编辑  收藏  举报