MySQL练习(1)

查询工资第二高的记录

查询超过经理收入的员工

查找重复的电子邮箱

找出从不订购的客户

删除重复的电子邮箱

题目描述:

查询工资为第二高的记录,如果没有第二高的记录则返回null

例如表Employee,应该查询出200

id salary
1 100
2 200
3 300

解题思路:

利用将工资降序排序然后去第二条记录,重点在于如何处理当不存在第二高的工资时返回null。一是将表作为临时表,二是用IFNULL()函数

参考SQL:

1
2
3
4
5
6
7
8
9
10
11
12
# SQL 1
select (
select distinct salary from Employee order by salary Desc limit 1 offset 1
) as SecondHignestSalary
# SQL 2
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighnestSalary

题目描述:

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
2
3
select a.name 
from Employee a,Employee b
where a.ManagerId = b.Id and a.Salary>b.Salary;

题目描述:

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

Id Email
1 a@b.com
2 c@b.com
3 a@b.com

解题思路:

用group by 和having

参考SQL:

1
2
3
4
select Email 
from Person
group by Email
having count(Email)>1

题目描述:

某网站包含两个表,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
2
3
4
select Name 
from Customers
where Id
not in (select CustomersId from Orders)

题目描述:

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个

Id Email
1 john@example.com
2 bob@example.com
3 john@example.com

解题思路:

自连接找出id最小的且有重复的那个邮箱

参考SQL:

1
2
3
4
# 删除满足where条件的p1
delete p1
from Person p1,Person p2
where p1.Email=p2.Email and p1.Id>p2.Id
------------- End -------------