之前一直是用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