LeetCode176: 第二高的薪水
一、题目描述
SQL架构
编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
二、解题思路
- 需要排除重复的值
- 再排个序
- 选出第二个
- 注意只有一个数据的情况
三、我的代码
# 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子句
要检索查询返回的行的一部分,请使用LIMIT
和OFFSET
子句。 以下说明了这些子句的语法:
SELECT
column_list
FROM
table1
ORDER BY
column_list
LIMIT row_count OFFSET offsetColumnNumber;
在这个语法中,
row_count
确定将返回的行数。
OFFSET
子句在开始返回行之前跳过偏移行。 OFFSET
子句是可选的。 如果同时使用LIMIT
和OFFSET
子句,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)