LeetCode MySQL刷題記錄(隨時更新)

之前一直是用LeetCode刷題,不能稱之爲刷題,往往做了幾十道題就不做了,這次發現LeetCode出了中文版,又想鞏固和加深自己的數據庫知識,因此改造之前廢棄的文章。
本篇文章題目來源是力扣,其實對應就是英文的LeetCode,在參加工作後由於業務、可用性、時效性等方面的要求很少會做一些複雜的數據庫操作,連連表查詢都不常見,連表查詢也基本上拆分成兩個簡單的sql,因此想從LeetCode上看看是否可以將自己的DML深入一下,本篇文章使用的MySQL語句。

175.組合兩個表

題目描述:

表1: Person

	+-------------+---------+
	| 列名         | 類型     |
	+-------------+---------+
	| PersonId    | int     |
	| FirstName   | varchar |
	| LastName    | varchar |
	+-------------+---------+
	PersonId 是上表主鍵

表2: Address

	+-------------+---------+
	| 列名         | 類型    |
	+-------------+---------+
	| AddressId   | int     |
	| PersonId    | int     |
	| City        | varchar |
	| State       | varchar |
	+-------------+---------+
	AddressId 是上表主鍵

編寫一個 SQL 查詢,滿足條件:無論 person 是否有地址信息,都需要基於上述兩表提供 person 的以下信息:

	FirstName, LastName, City, State

解題思路:

很簡單,考察的是* left join * on

select p.FirstName,p.LastName,a.City,a.State from Person p left join Address a on p.PersonId=a.PersonId;

176.第2高的薪水

題目描述:

編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。

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

例如上述 Employee 表,SQL查詢應該返回 200 作爲第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。

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

解題思路:

1.排序與分頁的組合,order by 與limit start,offset
2.若爲空,則返回null,使用IFNULL函數或者嵌套查詢
3.不同Id薪水可能存在重複情況,使用distinct關鍵字進行去重

IFNULL(expression_1,expression_2);

如果expression_1不爲NULL,則IFNULL函數返回expression_1; 否則返回expression_2的結果。

解法1(嵌套查詢):

select (select distinct Salary from Employee order by Salary desc limit 1,1) as SecondHighestSalary

解法2(IFNULL函數查詢):

select ifnull((select distinct Salary from Employee order by Salary desc limit 1,1), null)  as SecondHighestSalary;

177.第N高的薪水

題目描述:

編寫一個 SQL 查詢,獲取 Employee 表中第 n 高的薪水(Salary)。

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

例如上述 Employee 表,n = 2 時,應返回第二高的薪水 200。如果不存在第 n 高的薪水,那麼查詢應返回 null。

	+------------------------+
	| getNthHighestSalary(2) |
	+------------------------+
	| 200                    |
	+------------------------+

解題思路:

1.題目中給出了創建方法的標本
2.注意RETURN中不能使用加減法?還沒找到答案,需要在RETURN之前加入SET N=N-1;

解法:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    set n=N-1;
  RETURN (
      # Write your MySQL query statement below.
      select ifnull(
          (select distinct Salary from Employee order by Salary desc limit n,1)
          , null)
           as getNthHighestSalary
  );
END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章