LeetCode176: 第二高的薪水
技術標籤:我的leetcode刷題資料庫sql資料庫mysql
一、題目描述
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
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1;//若Salary只有一個值,則什麼都不返回,NULL也沒有
SELECT DISTINCT
Salary AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
;//若Salary只有一個值,則為NULL,SecondHighestSalary的值不存在,也不為空
錯誤結果
為空時,正確結果應為:(null)