【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