zoukankan      html  css  js  c++  java
  • 【sql】leetcode习题 (共 42 题)

    【175】Combine Two Tables (2018年11月23日,开始集中review基础)

    Table: Person
    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | PersonId    | int     |
    | FirstName   | varchar |
    | LastName    | varchar |
    +-------------+---------+
    PersonId is the primary key column for this table.
    Table: Address
    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | AddressId   | int     |
    | PersonId    | int     |
    | City        | varchar |
    | State       | varchar |
    +-------------+---------+
    AddressId is the primary key column for this table. 
    Write a SQL query for a report that provides the following information for each person in the Person table, regardless if there is an address for each of those people.
    FirstName, LastName, City, State 

    题解:因为题目要求说person表里面有的项目即使address表里没有也需要展示,所以用 left join

    select Person.FirstName as FirstName, Person.LastName as LastName, Address.City as City, Address.State as State from Person left join Address on Person.PersonId = Address.PersonId;

    【176】Second Highest Salary (第二高的工资)(2018年11月23日)

    Write a SQL query to get the second highest salary from the Employee table.
    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |
    +----+--------+
    
    For example, given the above Employee table, the query should return 200 as the second highest salary. If there is no second highest salary, then the query should return null.
    +---------------------+
    | SecondHighestSalary |
    +---------------------+
    | 200                 |
    +---------------------+

    注意,题目有个要求,如果没有第二高的工资要返回 null,而不是空条目。还有一个问题就是如果表里只有两条,但是两条的工资都是100, 这个需要返回 null,不是 100,所以要用 distinct

    我一开始写成了如下,但是没有第二高的工资要返回 null 这个条件不满足。所以 WA。

    select Salary as SecondHighestSalary from Employee order by Salary desc limit 1, 1;

    后来看了答案,答案说要重新搞一张表。(limit 1,1 和 limit 1 offset 1 是等价的)

    select (select distinct Salary from Employee order by Salary desc limit 1 offset 1) as SecondHighestSalary;

    【177】Nth Highest Salary (2018年11月23日)

    Write a SQL query to get the nth highest salary from the Employee table.
    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |
    +----+--------+
    
    For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.
    +------------------------+
    | getNthHighestSalary(2) |
    +------------------------+
    | 200                    |
    +------------------------+

    题意就是返回第 N 高的工资。和上面一题很像。注意点就是不能直接写 limit N-1, 1 语法会出错。

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
    #limit m, n 表示的是从第 m 个条目(m is 0 based)开始的 n 条, 如果下面直接用 N-1 的话不行的,语法错误。
      DECLARE M INT;
      SET M = N - 1;
      RETURN (
          select (select distinct Salary from Employee order by Salary desc limit M, 1)
      );
    END

    【178】Rank Scores (2018年11月23日)

    【180】Consecutive Numbers (2018年11月23日) 

    Write a SQL query to find all numbers that appear at least three times consecutively.
    +----+-----+
    | Id | Num |
    +----+-----+
    | 1  |  1  |
    | 2  |  1  |
    | 3  |  1  |
    | 4  |  2  |
    | 5  |  1  |
    | 6  |  2  |
    | 7  |  2  |
    +----+-----+
    
    For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.
    +-----------------+
    | ConsecutiveNums |
    +-----------------+
    | 1               |
    +-----------------+

    题解:本来不会写,后来找了题解:https://my.oschina.net/Tsybius2014/blog/494823

    可以用 select, 也可以 join, 还有一种通解的写法(如果把 3 延长到 N怎么办)

    select distinct L1.Num as ConsecutiveNums
    from Logs L1, Logs L2, Logs L3 
    where (L1.Id + 1 = L2.Id AND L1.Num = L2.Num) AND (L1.Id + 2 = L3.Id AND L2.Num = L3.Num) 

    【181】Employees Earning More Than Their Managers 

    The Employee table holds all employees including their managers. Every employee has an Id, and there is also a column for the manager Id.
    +----+-------+--------+-----------+
    | Id | Name  | Salary | ManagerId |
    +----+-------+--------+-----------+
    | 1  | Joe   | 70000  | 3         |
    | 2  | Henry | 80000  | 4         |
    | 3  | Sam   | 60000  | NULL      |
    | 4  | Max   | 90000  | NULL      |
    +----+-------+--------+-----------+
    
    Given the Employee table, write a SQL query that finds out employees who earn more than their managers. For the above table, Joe is the only employee who earns more than his manager.
    +----------+
    | Employee |
    +----------+
    | Joe      |
    +----------+

    题解:别名的使用。

    select e.Name as Employee
    from Employee as e, Employee as m
    where e.ManagerId = m.Id and e.Salary > m.Salary

    【182】Duplicate Emails (group by ... having ..子句, 2018年11月23日)

    Write a SQL query to find all duplicate emails in a table named Person.
    +----+---------+
    | Id | Email   |
    +----+---------+
    | 1  | a@b.com |
    | 2  | c@d.com |
    | 3  | a@b.com |
    +----+---------+
    
    For example, your query should return the following for the above table:
    +---------+
    | Email   |
    +---------+
    | a@b.com |
    +---------+
    Note: All emails are in lowercase.

    题解:

    select Email
    from Person 
    group by Email
    having count(Email) > 1

    【183】Customers Who Never Order 

    【184】Department Highest Salary 

    【185】Department Top Three Salaries 

    【196】Delete Duplicate Emails 

    【197】Rising Temperature 

    【262】Trips and Users 

    【569】Median Employee Salary 

    【570】Managers with at Least 5 Direct Reports 

    【571】Find Median Given Frequency of Numbers 

    【574】Winning Candidate (2018年11月24日)

    Table: Candidate
    +-----+---------+
    | id  | Name    |
    +-----+---------+
    | 1   | A       |
    | 2   | B       |
    | 3   | C       |
    | 4   | D       |
    | 5   | E       |
    +-----+---------+  
    Table: Vote
    +-----+--------------+
    | id  | CandidateId  |
    +-----+--------------+
    | 1   |     2        |
    | 2   |     4        |
    | 3   |     3        |
    | 4   |     2        |
    | 5   |     5        |
    +-----+--------------+
    id is the auto-increment primary key,
    CandidateId is the id appeared in Candidate table.
    Write a sql to find the name of the winning candidate, the above example will return the winner B.
    +------+
    | Name |
    +------+
    | B    |
    +------+
    Notes:
    You may assume there is no tie, in other words there will be at most one winning candidate.

    题解:注意 group by 和 order by 一起使用的时候,order by 中的列必须要出现在 group by 中。(solution里面还有别的方法)

    select Name
    from Candidate 
    where id = (select CandidateId from Vote group by CandidateId order by count(CandidateId) desc limit 1);                   

     【577】Employee Bonus (2018年11月23日)

    Select all employee's name and bonus whose bonus is < 1000.
    Table:Employee
    +-------+--------+-----------+--------+
    | empId |  name  | supervisor| salary |
    +-------+--------+-----------+--------+
    |   1   | John   |  3        | 1000   |
    |   2   | Dan    |  3        | 2000   |
    |   3   | Brad   |  null     | 4000   |
    |   4   | Thomas |  3        | 4000   |
    +-------+--------+-----------+--------+
    empId is the primary key column for this table.
    Table: Bonus
    +-------+-------+
    | empId | bonus |
    +-------+-------+
    | 2     | 500   |
    | 4     | 2000  |
    +-------+-------+
    empId is the primary key column for this table.
    Example ouput:
    +-------+-------+
    | name  | bonus |
    +-------+-------+
    | John  | null  |
    | Dan   | 500   |
    | Brad  | null  |
    +-------+-------+

    题解:left join语句,还用到了 sql 的三值逻辑(true, false, unkown)

    select emp.name as name, bon.bonus as bonus
    from Employee as emp
    left join Bonus as bon on emp.empId = bon.empId
    where bon.bonus < 1000 or bon.bonus is null

    【578】Get Highest Answer Rate Question 

    【579】Find Cumulative Salary of an Employee 

    【580】Count Student Number in Departments 

    【584】Find Customer Referee (2018年11月23日) 

    Given a table customer holding customers information and the referee.
    +------+------+-----------+
    | id   | name | referee_id|
    +------+------+-----------+
    |    1 | Will |      NULL |
    |    2 | Jane |      NULL |
    |    3 | Alex |         2 |
    |    4 | Bill |      NULL |
    |    5 | Zack |         1 |
    |    6 | Mark |         2 |
    +------+------+-----------+
    Write a query to return the list of customers NOT referred by the person with id '2'.
    For the sample data above, the result is:
    +------+
    | name |
    +------+
    | Will |
    | Jane |
    | Bill |
    | Zack |
    +------+

    题解:本题需要了解的知识点是, sql 的三值逻辑: true, false, unkown。一切和 null 比较的值都是 unkown, 包括 null 本身。所以 sql 提供了 'is null' 和 'is not null' 这两个关键词。

    select name from customer where referee_id <> 2 or referee_id is null;

    如果条件中只有 referee_id <> 2 这一个条件的话,那么只会返回 Zack 这一个结果。

    【585】Investments in 2016 

    【586】Customer Placing the Largest Number of Orders 

    【595】Big Countries 

    【596】Classes More Than 5 Students 

    【597】Friend Requests I: Overall Acceptance Rate 

    【601】Human Traffic of Stadium 

    【602】Friend Requests II: Who Has the Most Friends 

    【603】Consecutive Available Seats 

    【607】Sales Person 

    【608】Tree Node 

    【610】Triangle Judgement 

    【612】Shortest Distance in a Plane 

    【613】Shortest Distance in a Line 

    【614】Second Degree Follower 

    【615】Average Salary: Departments VS Company 

    【618】Students Report By Geography 

    【619】Biggest Single Number 

    【620】Not Boring Movies 

    【626】Exchange Seats 

  • 相关阅读:
    现代操作系统读书笔记 2
    java8 中 ImageIO 读取 tiff 格式的图片失败
    word 转 pdf,c#代码
    spring 技术内幕读书笔记1
    操作系统精髓与设计读书笔记1
    手把手教你WEB套打程序开发
    WEB打印控件Lodop使用体会
    listview下拉刷新 上拉(滑动分页)加载更多
    如何解析android访问webservice返回的SoapObject数据(可用)
    统计子串在另一个字符中出现的次数
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/9901918.html
Copyright © 2011-2022 走看看