说起SQL,是数分岗位的必备技能之一了。常见的考察SQL的方式主要是:
(1)笔试阶段,网上答题。包括PDD,携程,网易在内很多公司都会在笔试的时候来几个SQL作为筛选条件。网上答题的时候很有可能遇到变态的题目……只能多搜搜这些公司在往年笔试时候出题内容,然后进行针对性的准备了。
(2)现场面试写代码。在面试小红书,网易的时候,面试官也会现场抽出几道SQL题让你写代码。现场写代码不会遇到太难的题目,一般窗口函数排个序可以搞定,再难点也就是求中位数、众数这些。
(3)远程面试口述语法。像蘑菇街,趣头条,招银网络科技等等,是在远程面试(或者电面)的时候随便问起SQL常见的语法。以我的经验来看,电面的考察侧重于提问相似函数的不同点,毕竟让你口述一段代码也不现实……
其实不论是哪种考察模式,基本看完《SQL必知必会》,然后在牛客刷完在线SQL题就能够解决70%的问题了。那剩下的30%是什么呢?
——剩下的30%是对语法进行总结,避免陷入因为长时间不写而忘记的尴尬境地……也避免对某些函数进行混淆……
那我就直接放上来文字版了,主要是针对我在面试中被问到的一些常见函数用法以及混淆点做了简单总结(敲重点,不是所有常见的语法啦,只是我面试中被问到最多的哦),有事没事看两眼,就当复习咯。
当然,别偷懒,重点还是刷题or实习写代码
▼各种连接方式的区别?
inner_join: 内连接,根据两个表共有的列来匹配其中的行,强调只有两个表共有的列值对应的行才能匹配出来。
left join/right join/all join: (左,右,全)外连接,以left join 为例,如果指定了需要匹配的列名,无论右表对应行是否包含满足连接条件的数据,左表的数据都会提取出来,则结果会将右表的这些值以空值的形式匹配进来。
cross join: 交叉连接,结果是笛卡尔积,就是第一个表符合查询条件的行数乘以第二个表符合查询条件的行数。
▼索引的作用?
索引是为了提高数据库查询数据的速度而增加的标志符号(通过创建唯一性索引,可以保证表中每一行数据的唯一性)。索引主要建立在①经常搜索的列;②主键所在列;③外键所在列
索引包括聚集索引与非聚集索引,它们的区别在于索引记录的顺序与表记录的顺序是否一致。
聚集索引: 可以理解为索引记录的顺序与表记录的顺序一致,SQL默认在依次递增的主键上建立聚集索引,例如,id为1的数据在第一条,id为2的数据在第二条。聚集索引会按照主键的顺序来排序。(例如,用字典找字,对于认识的字可以通过拼音排序对应正文找到页码)
非聚集索引: 可以理解数据存储在一个地方,索引指向数据存储的位置,索引的顺序与表中数据记录的顺序不一定一致。例如说,建立数据表登记学生考试成绩,字段包括姓名,学号与分数。假定该表按照成绩排序、学号信息错乱,可以考虑构建非聚集索引,第一名对应1,第二名对应2……,想要提取第10个学生的学号,查找索引10指向的数据即可。(用字典找字,不认识的字可以采用部首结合笔画等信息在检字表中搜索,找到页码。比如查"张"字,检字表中"张"的页码是60页,检字表中"张"的上面是"驰"字,但页码却是100页,"张"的下面是"弩"字,页面是200页。很显然,在正文里面这些字并不是真正的分别位于"张"字的上下方,而检字表中连续的"驰、张、弩"三字实际上就是他们在非聚集索引中的排序)
(关于聚集索引和非聚集索引的区别可以百度学习下,我记得好几家面试都直接问了……)
▼排名函数与排序函数?
排序函数:order by (默认asc升序,指定desc降序),例如将表格数据按照考试成绩从低到高排序。
排名函数:rank, dense rank, row number ,得到的成绩的排序后,根据成绩的高低对学生排名,100分对应第一名,99分第二名。它们的区别在于:
row number: 根据成绩排序生成连续的序列号,1,2,3,4,5……
rank:和row number 不同,rank 考虑了相同分数学生的排名问题。如第一名100分,第2名两个人并列99分,那么98分的同学排名第四。
dense rank: 和rank的区别在于,同样考虑了分区内的排名,但dense rank的输出结果是连续的。如第一名100分,第2名两个人并列99分,那么98分的同学排名第三。
▼on 和 where 的区别?
前提:数据库在连接多张表返回记录时,都会生成一个中间临时表。
在内连接中,使用on或者where没有区别。
在外连接里,例如使用left join时:
on是在生成临时表时使用的条件,不管on的条件是否为真,都会返回左边表中的全部记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
▼连接多个select?
union:连接select,不允许重复值,而且select的对象要有相同的列以及数据类型;(例如A表中某字段的数据是1,1,2,3,4,B表中对应的数据是(0,0,0,0,0),则提取的数据是(1,0;2,0;3,0;4,0),也就是说(1,0)这个组合只会出现一次。)
union all:作用同union,但是允许重复值(也就是说,与上面一样的操作里,(1,0)这个组合会出现2次)
一般来说如果select 字段大于1个,用union all比用union速度快,因为union 会将多个结果中重复的数据合并,union all则是直接合并
Intersect: 和 union指令类似,intersect也是合并两个select语句结果的函数。不同的地方是, union的处理结果类似于全集 (如果这个值存在于第一个select或者第二个select,它就会被选出),而intersect则比较像取出交集 ( 值要同时存在于第一个select和第二个select)。
minus:先找出第一个 select 语句所产生的结果,然后看这些结果有没有在第二个 select语句的结果中。最后会输出第一个select中没有,但是第二个select中有的数据
▼主键和外键?
主键是一张表中能够确定一条记录的唯一标志(数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 ),比如身份证号。
外键用于和另一张表进行关联。例如,A字段是A表的主键,那么出现在B表中的A字段能够作为B表的外键,实现A,B表的连接查询。
▼向表中插入数据?
insert into tablename values: 普通插入数据模式
insert or ignore into: 如果没有则插入数据,如果有则忽略
insert or replace into: 如果不存在就插入,存在就更新
▼删除表中数据?
delete : 删除表中数据,可以指定具体数据(where)
drop column/ drop table : 删除列数据,与delete 不同,drop函数会将数据以及表的结构全部删除。
truncate:仅删除数据,且默认删除所有数据。和delete不同,truncate不能用where进行筛选,但删除速度比delete快
▼字符串常见操作函数?
concat(): 将多个字符串连接成一个字符串,连接符用“”包起来
concat_ws(); 将多个字符串连接成一个字符串,在最开始的位置指定连接符(指定一次即可)
group concat(): 将group by产生的同一个分组中的值连接起来,返回一个字符串。
like(): 需要与通配符一起使用('%'代表任意字符出现任意次数;'_'仅能匹配单个字符)
substr(): 用于从字段中提取相应位置的字符。
regexp() : 正则表达式匹配函数
▼ In/exist的联系与区别
子查询过程中,In和exist函数效率比较:
当进行连接的两个表大小相似,效率差不多;
如果子查询的内表更大,则exist的效率更高(exist先查询外表,然后根据外表中的每一个记录,分别执行exist语句判断子查询的内表是否满足条件,满足条件就返回ture)。
如果子查询的内表小,则in的效率高(in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积 (表中的每一行数据都能够任意组合A表有a行,B表有b行,最后会输出a*b行),然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快)。
Exist的原理: 使用exist时,若子查询能够找到匹配的记录,则返回true,外表能够提取查询数据;使用 not exist 时,若子查询找不到匹配记录,则返回true,外表能够提取查询数据。
近一年的工作中也攒下了不少的经验,准备在公众号慢慢整理数据分析方向校招的知识点和准备方式,目前想好的内容主要是:
【1】费米估算问题(已完成)
【2】业务场景题(已完成)
【3】AB实验和假设检验(已完成)
【4】应届生-数据分析方向自我介绍怎么准备(已完成)
【5】面试常见的SQL语法
【6】不懂算法但害怕面试中问到怎么办
【7】如何在面试中展示数据分析报告或者项目
【8】我的自我剖析文档有什么内容
………………
关注公众号回复“数据”即可收到一波我整理的pdf电子书,包括
1.精益数据分析
2.增长黑客
3.数据化管理
4.统计数字会撒谎
5.growing io出品的互联网第一本数据分析手册
等等
想要书或者想跟进的可以关注我~平时也会更新一些工作中对数据分析、数据产品、数据可视化的思考,一起交流啦~~~
微信公众号:阿狸和小兔