LeetCode-SQL(一)

  • 2019 年 12 月 20 日
  • 筆記

1.組合兩個表

表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就可以了。

SQL語句如下:

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

2.第二高的薪水

編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查詢應該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null。 +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+

這題也是一個入門題,找到排名第二的薪水,第一步先找到薪水最高的,然後排除掉,剩下的裡面最高的也就是第二個的薪水。當查詢不到時,SQL會自動返回為NULL。

SQL語句如下:

SELECT MAX(Salary) SecondHighestSalary FROM Employee A WHERE Salary<> (SELECT MAX(Salary) FROM Employee )

3.第N高的薪水

編寫一個 SQL 查詢,獲取 Employee 表中第 n 高的薪水(Salary)。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,n = 2 時,應返回第二高的薪水 200。如果不存在第 n 高的薪水,那麼查詢應返回 null。 +------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+

這是一個中級題,第一步要排除用戶輸入的無效數字,比如負數和大於去重後的行數的,賦默認值0,返回null值。

第二步去重,使用distinct去除薪水相同的,然後按從大到小排列,使用top取前n行,再取其中最小的就是第n高的薪水

SQL語句如下:

CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS

BEGIN

declare @num INT

select @num=count(distinct Salary) from EMPLOYEE

if(@N<0 or @N>@num)

set @N=0

RETURN (

select min(Salary) from EMPLOYEE where Salary in (

SELECT DISTINCT TOP (@N) Salary FROM EMPLOYEE order by Salary desc)

);

END

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/second-highest-salary

Tags: