Hello!!今天是DAY 2啦~一起来看看今天有什么题目吧~
闯关开始啦
关卡1-超过经理收入的员工
思路:
我们要保持一个思维:一张表,比较两个人的工资,我们首先要想到:将一张表变成两张表。
这个表格的意思是,1号Joe,他的经理是3号的Sam
所以我们就让第二张表中的ID 等于我们第一张表的Manager ID
这样出来的结果,就可以在每一列都出现,每一个员工和他对应的manager
然后,我们这个时候就对比每一行的工资,如果工资a大于工资b,则是我们选中的对象。
答案:
SELECT a.Name AS Employee FROM Employee AS a,Employee AS b
WHERE a.ManagerId = b.Id
AND a.Salary > b.Salary
恭喜过关!进入下一关!
关卡2 - 查找重复的电子邮箱
思路:
依旧保持一个思维:看到找重复,就要想到Group by函数
这道题我们把Group by用上,就可以看到他按照相同的邮箱号分组。
然后,我们在Group by后面加上HAVING 来筛选COUNT()>1 的~
结果如下:
SELECT Email FROM Person
GROUP BY Email
HAVING Count(Email)>1
恭喜过关!进入下一关!
关卡3 -从不订购的客户
思路:
既然有两张表, let's have a merge!
看起来我们需要第一张表作为主表,因为我们要看不订购的客户
相同的键是Id和CustomerId,merge之后,如果customerid是空的,则说明!她是没买东西的人!
所以我们用IS NULL 来筛选
答案:
SELECT C.Name AS Customers FROM Customers C
LEFT JOIN Orders O
ON C.Id = O.CustomerId
WHERE CustomerId is NULL
恭喜过关!进入下一关!
关卡4 -部门工资最高的员工
思路:
首先肯定是要JOIN然后选出MAX,但是这个版本是只生成一个IT最高,而IT有两个最高的,应该怎么解决呢?
那我们要先在临时表中选出最高的工资的那个数字和对应的department ID,然后再找出我们这个表等于这个数字和这个ID的行。
SELECT D.Name AS Department, E.Name AS Employee, E.Salary FROM Employee E
INNER JOIN Department D
ON E.DepartmentId = D.Id
WHERE (E.DepartmentId,E.Salary)
IN (SELECT E.DepartmentId,MAX(E.Salary)
FROM Employee E
GROUP BY DepartmentId)
从上面的答案我们可以看到一个IN关键字,没想到SQL里面也可以用IN,跟Python的有点像~,这个意思是说,我们需要筛选出E.DepartmentId,E.Salary是我们在临时表中筛选到的E.DepartmentId和MAX(E.Salary),就大功告成啦。
恭喜过关!进入下一关!
关卡5- 部门工资前三高的所有员工
思路:
首先,这道题最难的点在于,求出各部门前三个人的工资
这里的解法是,我们给原表e1做一个自连接,复制一张表e2,然后让这两个表格里面的department id相等,证明我们是在相同的department来做事
然后,我们让e2.salary > e1.salary, 筛选出大的工资
然后我们让count(distinct e2.salary) < 3,意思是不超过三个值比这些值大
最后,按照常规操作把两张表合并在一起,就可以啦
select d.Name as Department, e1.Name as Employee, e1.Salary
from Employee e1
join Department d
on e.DepartmentId = d.Id
where (
select count(distinct(e2.Salary)) From Employee e2
where e2.DepartmentId = e1 .DepartmentId
and e2.Salary > e1.Salary
)<3
恭喜过关!
今天学到的新知识:group by 后面加having,ISNULL 而不是=NULL, IN跟python的用法一样,
明天继续闯关~yay ~