LeetCode-SQL-one
本文中主要是介绍LeetCode
中关于SQL
的练习题,从易到难,循序渐进。文中会介绍题目和尽可能多的解答方案
- 组合两个表:通过
join
进行联结 - 第二高的薪水:
ifnull
和limit
的用法以及建立临时表 - 超过经理收入的员工:一个表的自连接实现
- 从不订购的客户:两个表的连接
关于SQL连接的问题解决,牢记下图
175-组合两个表
题目
有Person和Address两个表,编写SQL语句,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
1 | FirstName, LastName, City, State |
答案
1 | select FirstName, LastName, City, State |
176-第二高的薪水
题目
编写一个SQL
查询,获取 Employee
表中第二高的薪水(Salary);如果没有,则表示为NULL
答案
- 将不同的薪水按照降序排序
- 使用
limit
子句来获得第二高的薪水 - 如果没有第二高的薪水,使用
IFNULL
函数来解决
1 | select ifnull((select distinct Salary -- 某些员工的薪水可能相同,去重功能 |
1 | select (select distinct Salary -- ()里面的select语句是建立临时表,解决只有一条记录的问题 |
1 | select max(Salary) SecondHighestSalary |
limit的用法
- limit x:读取x条数据
- limit x,y:从x开始,读取y条数据
- limit y offset x:从x开始,读取y条数据
181-超过经理收入的员工
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
给定 Employee
表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
答案
通过同一个表的自连接和where
语句的判断来实现
1 | select a.Name Employee |
通过where语句来实现
1 | select a.Name Employee |
182-查找重复的电子邮箱
题目
编写一个 SQL 查询,查找 Person
表中所有重复的电子邮箱。
输出结果为:
答案
子句顺序:where>group by>having>order by
1 | -- 自己的答案 |
最好的方法
group by
进行汇总having
进行行过滤count(Email)
进行统计汇总数据,大于1则为重复
1 | select Email |
1 | select distinct(p1.Email) |
使用临时表解决
1 | select Email |
183-从不订购的客户
题目
某网站包含两个表,Customers
表和 Orders
表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。
输出结果为
答案
1 | -- 自己答案 |
1 | -- 官方答案 |
1 | -- 根据SQL连接来解决:查找不在某个表中的数据,在a中,但是不在b中 |