查询工资第二高的记录
查询超过经理收入的员工
查找重复的电子邮箱
找出从不订购的客户
删除重复的电子邮箱
题目描述:
查询工资为第二高的记录,如果没有第二高的记录则返回null
例如表Employee
,应该查询出200
id | salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
解题思路:
利用将工资降序排序然后去第二条记录,重点在于如何处理当不存在第二高的工资时返回null。一是将表作为临时表,二是用IFNULL()函数
参考SQL:
1 | # SQL 1 |
题目描述:
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id
Id | Name | Salary | ManagerId |
---|---|---|---|
1 | Joe | 70000 | 3 |
2 | Henry | 80000 | 4 |
3 | Sam | 60000 | null |
4 | Max | 90000 | null |
解题思路:
采用自连接方式查询
参考SQL:
1 | select a.name |
题目描述:
编写一个 SQL 查询,查找 Person
表中所有重复的电子邮箱
Id | |
---|---|
1 | a@b.com |
2 | c@b.com |
3 | a@b.com |
解题思路:
用group by 和having
参考SQL:
1 | select Email |
题目描述:
某网站包含两个表,Customers
表和 Orders
表。编写一个 SQL 查询,找出所有从不订购任何东西的客户
Customers
Id | Name |
---|---|
1 | Joe |
2 | Henry |
3 | Sam |
4 | Max |
Orders
Id | CustomerId |
---|---|
1 | 3 |
2 | 1 |
解题思路:
利用Not in
参考SQL:
1 | select Name |
题目描述:
编写一个 SQL 查询,来删除 Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
3 | john@example.com |
解题思路:
自连接找出id最小的且有重复的那个邮箱
参考SQL:
1 | # 删除满足where条件的p1 |