LeetCode-SQL(一)

时间:2021-10-05 06:23:02

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