MySQL例题
一、组合两个表
答案:
关键点:
PersonId 是 Person 表的主键,但不是 Address 表的主键,同时要满足无论 person 是否有地址信息,都要返回 person 的四个信息,所以这里用 left join 表关联。
二、第二高薪水
答案:
关键点:
1、只输出一个数字结果,要用 Distinct 去重。
2、查询第二高的 Salary,order by 要降序,同时结合 limit 函数就可以获得结果,这里也可以加上 offset 得到结果。
3、没有结果则返回 FULL,IFNULL 的用法。
三、超过经理收入的员工
答案:
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和原表进行比较查询
四、寻找重复的电子邮箱
答案:
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 即可。
五、从不订购的用户
答案:
SELECT Name AS Customers FROM Customers WHERE (SELECT COUNT(1) FROM Orders WHERE Orders.CustomerId=Customers.Id) = 0;
关键点:
利用子查询在Orders表中寻找各个顾客的Id在CustomerId中出现的次数
六、删除重复的邮件
答案:
关键点:
这里提供了两种方法,一种是先筛选出 id 较大的邮箱然后删除,另一种方法是直接选取 id 较小的 Email。
七、上升的温度
答案:
关键点:
1、同一个表里的数据做对比,需要将一张表关联使用两次。
2、计算两个时间之间的天数,需要用到函数 Datediff。
八、大的国家
答案:
<ignore_js_op>
关键点:
OR 的运用。
九、超过 5 名学生的课
答案:
关键点:
分组计数然后过滤筛选。
十、有趣的电影
答案:
<ignore_js_op>
关键点:
mod 函数的运用,!= 运算符的使用,排序。
十一、交换工资
答案:
<ignore_js_op>
关键点:
使用更新查询(update)和 case 语句
MEDIUM
一、第 N 高的薪水
答案:
关键点:
这题和之前的第 2 高薪水类似,只需要把 2 变成一个变量即可,创建函数的方式完成。limit 中直接写 N-1 会报错,所以用 SET 对 N 重新定义。
二、分数排名
答案:
关键点:
主要思路是对于每一个分数,找出表中有多少个大于或者等于该分数的不同分数,然后降序排列即可。比如 3.65,表里大于等于 3.65 的数字分别是 4、3.85 和 3.65,所以它的排名是 3。
三、连续出现的数字
答案:
<ignore_js_op>
关键点:
连续出现至少三次,所以需要比较 Num 的 Id 是三个连续的,然后 Num 相等即可。
四、部门最高工资
答案:
关键点:
先关联两张表得到部门和该部门的最高工资,然后最为新表去关联 Employee 就可得到数据。
五、换座位
答案:
关键点:
开始的时候我的想法是保持 id 不变,然后把一张表 left join 他本身,一个 id 不变,一个 id-1,但是发现这样操作不是很方便,然后采取 student 保持不变,去改变 id,用 case 语句就可以实现。第一个 when 表示偶数的 id-1,第二个 when 表示最大的数如果是计数则不变,最后的 else 表示 id+1,即非最大奇数的 id+1。
这里把难度为 EASY 和 MEDIUM 的 16 道免费题全部搞定了,小伙伴要是有更好的解决思路欢迎指导。还有三题难度为 HARD,如果小伙伴有兴趣的话可以自己去试一下。

浙公网安备 33010602011771号