200.SQL题
# 01.第二高的薪水
# 第二高的薪水 (opens new window)
使用子查询和
LIMIT
子句
SELECT DISTINCT
Salary AS Second
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
1
2
3
4
5
6
2
3
4
5
6
# 02.组合两个表
- 因为表 Address 中的 personId 是表 Person 的外关键字
- 所以我们可以连接这两个表来获取一个人的地址信息。
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId
1
2
3
2
3
# 03.部门工资最高的员工
因为 Employee 表包含 Salary 和 DepartmentId 字段,我们可以以此在部门内查询最高工资
然后,我们可以把表 Employee 和 Department 连接,再在这张临时表里用
IN
语句查询部门名字和工资的关系。
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM
Employee
JOIN
Department ON Employee.DepartmentId = Department.Id
WHERE
(Employee.DepartmentId , Salary) IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 04.删除重复的电子邮箱
# 4.1 题目描述
- 编写一个 SQL 查询,来删除
Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
1
2
3
4
5
6
7
2
3
4
5
6
7
# 4.2 解题思路
- 我们可以使用以下代码,将此表与它自身在电子邮箱列中连接起来。
- 相同电子邮件地址的更大 ID,所以我们可以像这样给
WHERE
子句添加一个新的条件。
SELECT p1.*
FROM Person p1,Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
1
2
3
4
2
3
4
- 因为我们已经得到了要删除的记录,所以我们最终可以将该语句更改为
DELETE
DELETE p1 FROM Person p1,Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
1
2
3
2
3
# 05.超过经理收入的员工
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 题解:实际上, JOIN 是一个更常用也更有效的将表连起来的办法,我们使用 ON 来指明条件。
SELECT a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
1
2
3
4
2
3
4
编辑 (opens new window)
上次更新: 2024/3/13 15:35:10