今天刷了四道简单的数据库题:
- 组合两个表
- 第二高的薪水
- 超过经理收入的员工
- 从不订购的客户
下面我们逐一解题:
1、组合两个表
解题思路:
- 组合两个表,我们可以考虑用连接,但是不能直接用内连接,因为有可能有的人没有城市信息,那么在内连接的情况下就会出现某个人因为没有城市信息而被筛选掉,因此我们用外左连接。
SQL语句:
select p.firstName,p.LastName,a.City,a.State
from Person as p left join Address as a
ON p.PersonId = a.PersonId
2、第二高的薪水
解题思路:
- 要得到第二高的薪水,那我们至少应该先得到第一高的薪水,在求出第一高的薪水之后,再查询表中所有小于最高薪水的记录,最后用max()求得第二高的薪水。
SQL语句:
select max(Salary) as SecondHighestSalary
from Employee
where Salary < (select max(Salary) from Employee)
3、超过经理收入的员工
解题思路:
- 因为员工和经理都在一个表中,如此我们使用自连接去解决本题。
SQL语句:
select e.Name as Employee
from Employee as e,Employee as m
where e.ManagerId = m.Id and e.Salary > m.Salary
4、从不定购的客户
解题思路:
- 在外左连接中,当副表中没有与主表对应的记录时,则会自动生成null记录与之对应。
- 在本题中,我们就可以使用外左连接的特性,去解决本题。当外左连接之后,没有订购的客户订单号肯定为空,因此我们只需要筛选出订单号为空的记录便是最终的结果。
SQL语句:
select c.Name Customers
from Customers c left join Orders o
on c.Id = o.CustomerId
where o.Id is null