本文中主要是介绍LeetCode
中关于SQL
的练习题,从易到难,循序渐进。
文中会介绍题目和尽可能多的解答方案
175-组合两个表
题目
有Person
和Address
两个表,编写SQL
语句,满足条件:无论 person
是否有地址信息,都需要基于上述两表提供 person
的以下信息:
FirstName, LastName, City, State
image
答案
select FirstName, LastName, City, State
from Person
left join Address on Person.PersonID=Address.PersonID; -- left join 会保留左表的所记录,右表中不存在的字段则表示NULL
176-第二高的薪水
题目
编写一个SQL
查询,获取 Employee
表中第二高的薪水(Salary);如果没有,则表示为NULL
image
答案
- 将不同的薪水按照降序排序
- 使用
limit
子句来获得第二高的薪水 - 如果没有第二高的薪水,使用
IFNULL
函数来解决
select ifnull((select distinct Salary -- 某些员工的薪水可能相同,去重功能
from Employee
order by Salary desc -- 降序排列
limit 1 offset 1), null) -- limit 1 offset 1 等价于limit 2, 1
as SecondHighestSalary
select (select distinct Salary -- ()里面的select语句是建立临时表,解决只有一条记录的问题
from Employee
order by Salary desc
limit 1 offset 1)
as SecondHighestSalary
select max(Salary) SecondHighestSalary
from Employee
where Salary < (select max(Salary) from Employee); -- where语句是先去掉最高的,再从剩下的当中寻求最高的,即第二高
limit的用法
- limit x:读取x条数据
- limit x,y:从x开始,读取y条数据
- limit y offset x:从x开始,读取y条数据
181-超过经理收入的员工
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
给定 Employee
表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
image
答案
通过同一个表的自连接和where
语句的判断来实现
select a.Name Employee
from Employee a
join Employee b on a.ManagerID=b.Id
where a.Salary > b.Salary;
通过where语句来实现
select a.Name Employee
from
Employee a,
Employee b
where a.ManagerID=b.Id
and a.Salary > b.Salary
网友评论