【sql】leetcode习题 (共 42 题)

时间:2022-10-02 12:28:26

【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