前言
这段时间,刷了LeetCode的数据库题目,挺有感触的。在刷这些题之前,我只写过一般的增删改查,尤其是查询操作,使用的也不是很灵活,只知道最基本的用法。
去刷了题目之后真的学到了很多不论是新的知识点还是一些组合用法,总之对数据库操作尤其是dql的使用更加熟练了。感谢其他leetcoder对各种知识点和解题套路的分享,学会这些小操作后,写sql头不疼了,腰不酸了,睡得着了,吃饭也更香了。
根据这些题,我总结了一些常用的知识点、小技巧以及部分有代表性的题解。
这篇文章就来分享一些有价值的题解。题目有些多,这篇先展示其中八题的题解。
剩下的在这里
- 题目总结——经典题目题解与分析(二)–简单
- 题目总结——经典题目题解与分析(三)–简单
超过经理收入的员工
题目链接
真的很经典的一道题了,按照题号开始刷题的话这是第一个碰上的不好写的题目。
主要难点在于对同一个表中某些行的特定字段进行比较。由于SQL不能像一般编程语言那样自由的对表中的数据进行“遍历”
对于这样的题,特点就是比较不同行的同一列,而非同一行的不同列,不便于直接处理。
解决它的方法就是进行自联结,在该表的笛卡尔积中我们能找到所有行与行的组合,再使用条件筛选出其中需要比较的行,剩下的问题就转化成了同一行的不同列进行比较。
select
e1.name as employee
from
employee e1
left join employee e2 on e1.managerId = e2.id
where
e1.salary > e2.salary;
连续空余座位
题目链接
这个题目仍旧是比较一张表中同一字段的不同行。
直接使用自联结,将那些需要比较的行的组合(相邻的两行)筛选下来,进行同一行不同字段的比较。
select
c1.seat_id
from
cinema c1
left join cinema c2 on c1.seat_id = c2.seat_id - 1
left join cinema c3 on c1.seat_id