数据库SQL

LeetCode-SQL-one

2020-02-01  本文已影响0人  皮皮大

本文中主要是介绍LeetCode中关于SQL的练习题,从易到难,循序渐进。

文中会介绍题目和尽可能多的解答方案

175-组合两个表

题目

PersonAddress两个表,编写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

答案

  1. 将不同的薪水按照降序排序
  2. 使用limit子句来获得第二高的薪水
  3. 如果没有第二高的薪水,使用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的用法

  1. limit x:读取x条数据
  2. limit x,y:从x开始,读取y条数据
  3. 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
上一篇下一篇

猜你喜欢

热点阅读