快乐SQL做题 - Day2

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 ~

你可能感兴趣的:(快乐SQL做题 - Day2)