内容简介:好几天没有认真刷题了,这两天猛刷了一把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 | |
1 | a@b.com |
2 | c@d.com |
3 | a@b.com |
根据以上输入,你的查询应返回以下结果:
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 | |
1 | john@example.com |
2 | bob@example.com |
3 | john@example.com |
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行: | |
---|---|
Id | |
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
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》 这本书的介绍吧!