MySQL例题

 

一、组合两个表
MYSQL——Leetcode 刷题(免费版)-1.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-2.jpg 
关键点:
PersonId 是 Person 表的主键,但不是 Address 表的主键,同时要满足无论 person 是否有地址信息,都要返回 person 的四个信息,所以这里用 left join 表关联。

二、第二高薪水
MYSQL——Leetcode 刷题(免费版)-3.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-4.jpg 
关键点:
1、只输出一个数字结果,要用 Distinct 去重。
2、查询第二高的 Salary,order by 要降序,同时结合 limit 函数就可以获得结果,这里也可以加上 offset 得到结果。
3、没有结果则返回 FULL,IFNULL 的用法。

三、超过经理收入的员工
MYSQL——Leetcode 刷题(免费版)-5.jpg 
答案:

SELECT a.Name AS Employee
FROM (SELECT Name, Salary, ManagerId FROM Employee WHERE ManagerId IS NOT NULL) AS a, Employee AS b 
WHERE a.ManagerId=b.Id AND a.Salary>b.Salary

关键点:

利用子查询先将不是的经理的雇员选出来,归为表a,然后将表a和原表进行比较查询


四、寻找重复的电子邮箱
MYSQL——Leetcode 刷题(免费版)-7.jpg 
答案:

select DISTINCT a.Email
    from Person a
INNER JOIN
Person b
    WHERE
a.Email=b.Email AND a.id!=b.id;

  

select email from person group by email having count(email)>=2


关键点:
先对每个邮箱出现的次数计数,然后用 having 函数过滤掉不符合条件的 Email 作为一张新的表,再选取 Email 即可。

五、从不订购的用户
MYSQL——Leetcode 刷题(免费版)-9.jpg 
答案:

SELECT Name AS Customers FROM Customers 
WHERE (SELECT COUNT(1) FROM Orders WHERE Orders.CustomerId=Customers.Id) = 0;

关键点:

利用子查询在Orders表中寻找各个顾客的Id在CustomerId中出现的次数

六、删除重复的邮件
MYSQL——Leetcode 刷题(免费版)-11.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-12.jpg 
关键点:
这里提供了两种方法,一种是先筛选出 id 较大的邮箱然后删除,另一种方法是直接选取 id 较小的 Email。

七、上升的温度
MYSQL——Leetcode 刷题(免费版)-13.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-14.jpg 
关键点:
1、同一个表里的数据做对比,需要将一张表关联使用两次。
2、计算两个时间之间的天数,需要用到函数 Datediff。

八、大的国家
MYSQL——Leetcode 刷题(免费版)-15.jpg 
答案:
<ignore_js_op>MYSQL——Leetcode 刷题(免费版)-16.jpg 
关键点:
OR 的运用。

九、超过 5 名学生的课
MYSQL——Leetcode 刷题(免费版)-17.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-18.jpg 
关键点:
分组计数然后过滤筛选。

十、有趣的电影
MYSQL——Leetcode 刷题(免费版)-19.jpg 
答案:
<ignore_js_op>MYSQL——Leetcode 刷题(免费版)-20.jpg 
关键点:
mod 函数的运用,!= 运算符的使用,排序。

十一、交换工资
MYSQL——Leetcode 刷题(免费版)-21.jpg 
答案:
<ignore_js_op>MYSQL——Leetcode 刷题(免费版)-22.jpg 
关键点:
使用更新查询(update)和 case 语句

MEDIUM
一、第 N 高的薪水
MYSQL——Leetcode 刷题(免费版)-23.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-24.jpg 
关键点:
这题和之前的第 2 高薪水类似,只需要把 2 变成一个变量即可,创建函数的方式完成。limit 中直接写 N-1 会报错,所以用 SET 对 N 重新定义。

二、分数排名
MYSQL——Leetcode 刷题(免费版)-25.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-26.jpg 
关键点:
主要思路是对于每一个分数,找出表中有多少个大于或者等于该分数的不同分数,然后降序排列即可。比如 3.65,表里大于等于 3.65 的数字分别是 4、3.85 和 3.65,所以它的排名是 3。

三、连续出现的数字
MYSQL——Leetcode 刷题(免费版)-27.jpg 
答案:
<ignore_js_op>MYSQL——Leetcode 刷题(免费版)-28.jpg 
关键点:
连续出现至少三次,所以需要比较 Num 的 Id 是三个连续的,然后 Num 相等即可。

四、部门最高工资
MYSQL——Leetcode 刷题(免费版)-29.jpg 

 


答案:
MYSQL——Leetcode 刷题(免费版)-30.jpg 
关键点:
先关联两张表得到部门和该部门的最高工资,然后最为新表去关联 Employee 就可得到数据。

五、换座位
MYSQL——Leetcode 刷题(免费版)-31.jpg 
答案:
MYSQL——Leetcode 刷题(免费版)-32.jpg 
关键点:
开始的时候我的想法是保持 id 不变,然后把一张表 left join 他本身,一个 id 不变,一个 id-1,但是发现这样操作不是很方便,然后采取 student 保持不变,去改变 id,用 case 语句就可以实现。第一个 when 表示偶数的 id-1,第二个 when 表示最大的数如果是计数则不变,最后的 else 表示 id+1,即非最大奇数的 id+1。

这里把难度为 EASY 和 MEDIUM 的 16 道免费题全部搞定了,小伙伴要是有更好的解决思路欢迎指导。还有三题难度为 HARD,如果小伙伴有兴趣的话可以自己去试一下。

posted @ 2019-06-18 15:04  毛丫头  阅读(116)  评论(0)    收藏  举报