最近做了LeetCode的数据库部分,并发布到我的博客中, 现把数据库部分的十九道题目汇总在这儿,方便查看,题目感觉有的难有的简单,后续做算法部分,会吹嘘更新到这里, 算法还是很难的,
地址:https://leetcode-cn.com/problemset/database/
1. 组合两个表
表1: Person
1 | +-------------+---------+ |
表2: Address
1 | +-------------+---------+ |
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
1 | FirstName, LastName, City, State |
MYSQL
1 | select p.FirstName, p.LastName, a.City, a.State |
2. 第二高的薪水
编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary) 。
1 | +----+--------+ |
例如上述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
。
1 | +---------------------+ |
MySQL
1 | select max(Salary) as SecondHighestSalary |
3. 第N高的薪水
编写一个 SQL 查询,获取 Employee
表中第 n 高的薪水(Salary)。
1 | +----+--------+ |
例如上述 Employee
表,n = 2 时,应返回第二高的薪水 200
。如果不存在第 n 高的薪水,那么查询应返回 null
。
1 | +------------------------+ |
MYSQL
1 | CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT |
4. 分数排名
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
1 | +----+-------+ |
例如,根据上述给定的 Scores
表,你的查询应该返回(按分数从高到低排列):
1 | +-------+------+ |
MYSQL
1 | # Write your MySQL query statement below |
5. 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
1 | +----+-----+ |
例如,给定上面的 Logs
表, 1
是唯一连续出现至少三次的数字。
1 | +-----------------+ |
1 | # Write your MySQL query statement below |
6. 超过经理收入的员
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
1 | +----+-------+--------+-----------+ |
给定 Employee
表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
1 | +----------+ |
MYSQL
1 | select name as Employee |
7. 查找重复的电子邮箱
编写一个 SQL 查询,查找 Person
表中所有重复的电子邮箱。
示例:
1 | +----+---------+ |
根据以上输入,你的查询应返回以下结果:
1 | +---------+ |
说明:所有电子邮箱都是小写字母。
MYSQL
1 | select email |
8. 从不订购的客户
某网站包含两个表,Customers
表和 Orders
表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。
Customers
表:
1 | +----+-------+ |
Orders
表:
1 | +----+------------+ |
例如给定上述表格,你的查询应返回:
1 | +-----------+ |
MYSQL
1 | -- 方式一 |
9.部门工资最高的员工
Employee
表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
1 | +----+-------+--------+--------------+ |
Department
表包含公司所有部门的信息。
1 | +----+----------+ |
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
1 | +------------+----------+--------+ |
MYSQL
1 | select d.name Department, e.name Employee, max(e.Salary) Salary |
10.部门工资前三高的员工
Employee
表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。
1 | +----+-------+--------+--------------+ |
Department
表包含公司所有部门的信息。
1 | +----+----------+ |
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:
1 | +------------+----------+--------+ |
MYSQL
1 | select d.name Department, e.name Employee, max(e.Salary) Salary |
11. 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
1 | +----+------------------+ |
例如,在运行你的查询语句之后,上面的 Person
表应返回以下几行:
1 | +----+------------------+ |
MYSQL
1 | DELETE p2 FROM Person p1, Person p2 |
12. 上升的温度
给定一个 Weather
表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
1 | +---------+------------------+------------------+ |
例如,根据上述给定的 Weather
表格,返回如下 Id:
1 | +----+ |
MYSQL
1 | select w1.id |
13. 行程和用户
Trips
表中存所有出租车的行程信息。每段行程有唯一健 Id,Client_Id 和 Driver_Id 是 Users
表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
1 | +----+-----------+-----------+---------+--------------------+----------+ |
Users
表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
1 | +----------+--------+--------+ |
写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
1 | +------------+-------------------+ |
MYSQL
1 | select t.Request_at, sum(case when t.Status != 'completed' then 1 else 0 end) / count(id) as 'Cancellation Rate' |
14. 大的国家
这里有张 World
表
1 | +-----------------+------------+------------+--------------+---------------+ |
如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和地区。
例如,根据上表,我们应该输出:
1 | +--------------+-------------+--------------+ |
MYSQL
1 | select name, population, area |
15. 超过5名学生的课
有一个courses
表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
1 | +---------+------------+ |
应该输出:
1 | +---------+ |
Note:
学生在每个课中不应被重复计算。
MYSQL
1 | select class |
16. 体育馆的人流量
X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (date)、 人流量 (people)。
请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
例如,表 stadium
:
1 | +------+------------+-----------+ |
对于上面的示例数据,输出为:
1 | +------+------------+-----------+ |
Note:
每天只有一行记录,日期随着 id 的增加而增加。
MYSQL
1 | select distinct s1.* |
17. 有趣的电影
某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring
(不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating
排列。
例如,下表 cinema
:
1 | +---------+-----------+--------------+-----------+ |
对于上面的例子,则正确的输出是为:
1 | +---------+-----------+--------------+-----------+ |
MYSQL
1 | select * |
18. 换座位
小美是一所中学的信息科技老师,她有一张 seat
座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
示例:
1 | +---------+---------+ |
假如数据输入的是上表,则输出结果如下:
1 | +---------+---------+ |
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
MYSQL
1 | select (case |
19. 交换工资
给定一个 salary
表,如下所示,有m=男性 和 f=女性的值 。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
例如:
1 | | id | name | sex | salary | |
运行你所编写的查询语句之后,将会得到以下表:
1 | | id | name | sex | salary | |
MYSQL
1 | update salary set sex = (CASE WHEN sex = 'm' THEN 'f' ELSE 'm' END) |