编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-highest-salary
解题:
首先应该对工资排序,这样才能确认第二高的工资,所以首先要用到 Order by子句,然后使用LIMIT子句选择,要用到distinct:
SELECT DISTINCT
Salary AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 , 1
上面的简答存在的问题:如果没有第二最高工资,本表可能只有一项记录。为了克服这个问题,可以将其作为临时表。
SELECT
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary
第二种方法:
用“IFNULL” 函数处理可能为空的问题。如果结果为空则返回null.
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
ifnull()函数:
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL(expression, alt_value)
如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。
临时表:
首先,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
AS:
设置别名,可省略
ORDER BY 子句:
将查询数据排序后再返回数据
可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
可以设定多个字段来排序。
可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列(例如数字,小数在前面)。
DESC :降序
SELECT Company, OrderNumber FROM Orders ORDER BY Company,OrderNumber DESC
可以添加 WHERE...LIKE 子句来设置条件。
DISTINCT:
关键词 DISTINCT 用于返回唯一不同的值。
SELECT DISTINCT Company FROM Orders
LIMIT
子句:
来约束结果集中的行数.
LIMIT
子句接受一个或两个参数。两个参数的值必须为零或正整数。
SELECT
*
FROM
table
LIMIT offset(从什么位置开始) , count(要显示几行);
使用带有一个参数的LIMIT
子句时,此参数将用于确定从结果集的开头返回的最大行数。可用LIMIT
子句来选择表中的前N
行记录:
SELECT
*
FROM
table
LIMIT count;
等价
SELECT
*
FROM
table
LIMIT 0,count;
LIMIT
子句经常与ORDER BY子句一起使用。用来查询最高或者最低值,也可以查询第n高值,例如本题。