1. 程式人生 > 其它 >LeetCode176: 第二高的薪水

LeetCode176: 第二高的薪水

技術標籤:我的leetcode刷題資料庫sql資料庫mysql

一、題目描述

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
       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)