LeetCode-SQL-one

作者: 皮皮大 | 来源:发表于2020-02-01 17:25 被阅读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
    

    相关文章

      网友评论

        本文标题:LeetCode-SQL-one

        本文链接:https://www.haomeiwen.com/subject/kgsxxhtx.html