掌握了以下几种方法,你就可以轻松解决95%的SQL面试题!
本篇内容包括
(1)三个帮你快速解决问题的Tips
(2)SQL面试必备知识点
(3)SQL经典面试题
01
三个tips帮你面试时快速正确解决问题
1、答题前多思考
在看到面试题目的时候,先想一下你最后要的表是什么样的,primary key(主键)是什么,summary statistics(统计概要)是什么,然后从已有的表里面如何推到你想要的表。这个步骤我建议大家把自己的想法直接说出来。面试中最忌讳自己在默默的想,不和面试官交流,你在展现你的思路的时候,既能帮助你更好理清思路,也能保持和面试官的交流。
2、巧用with语句
当你的语句超过两个from的时候,整个script(脚本)就会非常的复杂,所以建议用with语句,每次需要改变primary key(主键)的时候都建一个新表,合理命名让你在下一步可以直接用简单的column name
3、思考corner case(边界案例)
如果你的表格里有null值,你会怎么处理?根据题目的条件,是不是用别的值代替?如果你的分母可能是0,怎么办?是不是要用safe_divide代替普通的slash/。写完了以后再检查一下有没有丢一些语句或者没有考虑到corner case。
02
必备知识点:
1、window function
window function在我看来是不改变data的行数的情况下,把group by的一些stats分到了每一行。
比如说 sum(revenue) over (partition by country) 就是把每个country的revenue加了一下,行数和原来不变,所有美国的行的这个数据都是美国revenue的总和。常见的window function还有RANK等。在这里着重讲一下RANK()、DENSE_RANK()、ROW_NUMBER()三者排序的不同:
RANK()返回的是不持续的编号,例如100, 101, 101, 102返回的编号将是1,2,2,4;
DENSE_RANK()返回的是持续的编号,例如100, 101, 101, 102返回的编号是1,2,2,3;
ROW_NUMBER()返回的是持续不重复的编号,例如100, 101, 101, 102返回的编号将是1,2,3,4。
2、 join的区别
一共有5种join语句,left, right, inner, full outer, cross join。目的都是一样的,就是用相同的key把两张表的column并起来。
left就是保留所有在左边的数据的行数,无论右边能不能找到对应的key。
inner就是只保留两张表共同的key。
full outer join就会把两张表所有的行保留。
cross join会把两张表每一行都和另一张表的每一行join,这个计算量非常大,一般要尽量避免。
03
经典面试题
在面试前刷一遍经典面试题可以帮助理解语句和知识点。在这里我挑选了两个经常被面到的题目:
(更多题目可以参考原链接:https://zhuanlan.zhihu.com/p/38354000)
查找1990年出生的学生名单,学生表中出生日期列的类型是datetime
select 学号,姓名
from student
where year(出生日期)=1990;
查询所有学生的学号、姓名、选课数、总成绩
selecta.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩from student as a left join score as bon a.学号 = b.学号group by a.学号;
查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select a.学号,a.姓名, avg(b.成绩) as 平均成绩from student as a left join score as bon a.学号 = b.学号group by a.学号having avg(b.成绩)>85;
查询学生的选课情况:学号,姓名,课程号,课程名称
select a.学号, a.姓名, c.课程号,c.课程名称from student a inner join score b on a.学号=b.学号inner join course c on b.课程号=c.课程号;
更多SQL经典面试题,在这文章中也有详细的介绍:
https://m.nowcoder.com/discuss/95812?&headNav=www
以上链接中的题目数量很多,但只有多做多练才能更好的掌握知识点,帮助你在面试中取得更好的成绩。
希望以上回答对你的面试有所帮助!有什么问题欢迎后台留言告诉我们~