小李飞刀:SQL题目刷起来!

栏目: 数据库 · 发布时间: 5年前

内容简介:好几天没有认真刷题了,这两天猛刷了一把SQL题目。然后用hexo搭建了自己的leetcode上对于数据库是有单独的19题的,我现在的进度是8/19,刷的还是有点慢,而且很多地方效率不高,还得做n刷处理。

随便说说

好几天没有认真刷题了,这两天猛刷了一把 SQL 题目。

然后用hexo搭建了自己的 BLOG ,还在摸索中,后续渐渐的就会两边都同步文章。

SQL题集

leetcode上对于数据库是有单独的19题的,我现在的进度是8/19,刷的还是有点慢,而且很多地方效率不高,还得做n刷处理。

毕竟后续如果考虑到要说数据分析的话,取数上的效率也得保证。

第一题

175. 组合两个表

难度:简单

表1: Person

列名 类型
PersonId int
FirstName varchar
LastName varchar

PersonId 是上表主键

表2: Address

列名 类型
AddressId int
PersonId int
City varchar
State varchar

AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

我的题解:

SELECT Person.FirstName,Person.LastName,Address.City,Address.State
From Person 
Left Join Address
ON Person.PersonId = Address.PersonId

解题思路:

因为无论address可能为空,所以用left join的方式,加入Address表。

其他:

很久没有用过left join,有些概念有点忘记,顺便来复习下知识点。

left join 之前的左表是会被完全返回的,哪怕left join的右表没有对应的数据。

select * from table_1 left join table_2

这里的话会返回所有 table_1 的行。

sql的left join 、right join 、inner join之间的区别:

- left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

- right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

- inner join(等值连接) 只返回两个表中联结字段相等的行

第二题

176. 第二高的薪水

难度:简单

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
Id Salary
1 100
2 200
3 300

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

SecondHighestSalary
200

我的题解:

SELECT MAX(Salary) AS SecondHighestSalary  FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee)

解题思路:

使用 max() 来获取两次最大值,因为是同一张表,小于最大值的“最大值”就是第二大的值了。

其他:

一般主要查找最大值,这题查找的是第二大的值。

主要是思路上要调整下,一般程序语言上会做排序。

SQL里面也可以考虑用 排序 试下,如果要取第二条数据的话,就得先取前两条数据,再倒序取第一条。

第三题

181. 超过经理收入的员工

难度:简单

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
Id Name Salary ManagerId
1 Joe 70000 3
2 Henry 80000 4
3 Sam 60000 NULL
4 Max 90000 NULL

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

Employee
Joe

我的题解:

SELECT p1.Name AS Employee FROM Employee p1,Employee p2
WHERE p1.ManagerId = p2.Id
AND p1.Salary > p2.Salary

解题思路:

查询两次同一张表,主条件为匹配经理Id和用户Id,再做比对大小。

其他:

对于同一张表查询两次,其实应该验证下效率到底如何,检查下是否有更快的查询方案。

第四题

182. 查找重复的电子邮箱

难度:简单

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

示例:
Id Email
1 a@b.com
2 c@d.com
3 a@b.com

根据以上输入,你的查询应返回以下结果:

Email
a@b.com

说明:所有电子邮箱都是小写字母。

我的题解:

SELECT distinct(p1.Email) from Person p1,Person p2
where p1.Email = p2.Email
AND p1.Id != p2.Id

解题思路:

还是查询同一张表两次,然后使用distinct,只输出单个结果。

其他:

distinct 用于返回唯一不同的值。

有distinct的字段必须放在开头。

第五题

183. 从不订购的客户

难度:简单

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

Id Name
1 Joe
2 Henry
3 Sam
4 Max
Orders 表:
Id CustomerId
1 3
2 1

例如给定上述表格,你的查询应返回:

Customers
Henry
Max

我的题解:

SELECT c.name AS Customers FROM Customers c
WHERE c.Id Not in(SELECT CustomerId FROM Orders)

解题思路:

取出Order表的数据,然后和Customers的Id做校验。

其他:

如果不是用取出Customers的ID来做比较的,就是Id!=CusomerId,而是查询两张表直接输出结果的话,会把每次的不对应的结果都输出。因为等于两张表都被完整比对过一次。

第六题

184. 部门工资最高的员工

难度:中等

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
Id Name Salary DepartmentId
1 Joe 70000 1
2 Henry 80000 2
3 Sam 60000 2
4 Max 90000 1
Department 表包含公司所有部门的信息。
Id Name
1 IT
2 Sales

编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

Department Employee Salary
IT Max 90000
Sales Henry 80000

我的题解:

select d.Name as Department,e.Name as Employee,e.Salary from Department d,Employee e
where e.DepartmentId = d.ID
and e.Salary = (select max(Salary) from Employee where d.id = DepartmentId)

解题思路:

这题参考了其他人的思路,后续需要自己再写一次。

其实是转了两次弯,第一次是根据部门Id查询出每个部门最高的薪水,再根据这个薪水找到对应的人。

其他:

第七题

196. 删除重复的电子邮箱

难度:简单

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
Id Email
1 john@example.com
2 bob@example.com
3 john@example.com

Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
Id Email
1 john@example.com
2 bob@example.com

我的题解:

DELETE p1 FROM Person p1,Person p2
WHERE p1.Email = p2.Email and p1.Id > p2.Id

解题思路:

这题一开始也有点被绕住了,后面渐渐做多了两次查询同步一张表就还好,

核心思路就是查询相同的值,且Id不同,我们delete的是Id较大的那一行。

其他:

Null.

第八题

596. 超过5名学生的课

难度:简单

有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

例如,表:
student class
A Math
B English
C Math
D Biology
E Math
F Computer
G Math
H Math
I Math
应该输出:
class
Math

我的题解:

select class From course group by class having count(class)>=5

解题思路:

对课程进行分组,分组后记数大于等于5的就取出数值。

其他

Null

学生在每个课中不应被重复计算。

我的题解:

SELECT class FROM (select distinct * from courses) as new
GROUP BY class HAVING count(*) >= 5

解题思路:

其他:


以上所述就是小编给大家介绍的《小李飞刀:SQL题目刷起来!》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming Amazon Web Services

Programming Amazon Web Services

James Murty / O'Reilly Media / 2008-3-25 / USD 49.99

Building on the success of its storefront and fulfillment services, Amazon now allows businesses to "rent" computing power, data storage and bandwidth on its vast network platform. This book demonstra......一起来看看 《Programming Amazon Web Services》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具