数据分析 | 实习、秋招中SQL常考知识点

实习到秋招,经历了50+面试,特别是一面很喜欢考点sql知识点,下面是我面试数据分析岗位,在美团、快手、猿辅导等互联网公司,以及银行,美的等实业公司中遇到的常考SQL知识点

1.表连接,几种join的区别?

INNER JOIN(内连接)

结果是左表和右表关联字段相同的交集。即查询结果为下图重合部分的数据;

LEFT JOIN(左连接)

结果是左表的所有数据+右表中和左表重合部分的数据,即以左表为准,左表的数据全部查询,而右表的数据则只显示匹配的数据,不匹配的数据为null;

RIGHT JOIN(右连接)

结果右表的所有值,左表中有匹配的则有值,不匹配的则null表示,和left join 相反;

FULL OUTER JOIN(全连接)

结合了LEFT JOIN和RIGHT JOIN的结果,并使用NULL值作为两侧缺失匹配结果。

这道题目基本在面快手、美团等的实习,还有渤海银行、猿辅导等公司的数据分析秋招中都考察过。

2. 排序窗口函数有什么,之间的区别?

• ROW_NUMBER、RANK、DENSE_RANK 专用排序的窗口函数、

• 语法

函数() over(partition by "要分组的列"

order by "要排序的列" desc/asc)

• 区别—排序中用相同数据出现时(如数据是5,5,3,降序排列)

ROW_NUMBER

相同数据,先查出的排名在前,没有重复值,排名为1,2,3;

○ RANK

跳跃排序,相同数据排名相同,比如并列第1,则两行数据都标为1,下一位将是第3名.中间的2被跳过。排名存在重复值113;

○ DENSE_RANK

连续排序的,比如两条并列第1,则两行数据都标为1,下一个排名将是第2名,排名为1,1,2。

3. sql语句的执行顺序是什么?

• 执行顺序

from →join →on →where →group by→avg/sum/…→having→select→distinct→order by→limit

• 具体含义

from:需要从哪个数据表检索数据,如果有join则对 FROM 子句中的前两个表执行笛卡尔积(交叉联接)

生成临时表(n×m行);

on :对以上临时表进行条件筛选;

join:补充左表或右表保持完整。如果有关联多个表,则中间表对下个表继续以上两步的操作;

where:过滤表中数据的条件;

group by:如何将上面过滤出的数据分组;

avg/sum/…:聚合函数;

having:对上面已经分组的数据进行过滤的条件;

select:查看结果集中的哪个列,或列的计算结果;

distinct:去重

order by:按照什么样的顺序来查看返回的数据

limit:限制查询结果返回的数量

4. 去重方法

distinct

对单字段、多字段去重,必须放在第一个查询字段前,效率比较低,一般与 count 配合用来计算条数;

(注意多字段的话,即字段的不同组合作为一个整体去重,而不是依次对每个字段去重)

group by

将去重的单/多字段放在groupby后,select查询出去重结果,也是整体去重;

窗口函数

对要去重的字段进行分组后排序,并且将排名设置为1

<窗口函数> over (partition by <去重字段> order by <用于排序的列名>)

5. 如何确认数据是否取对?---这也是实际工作中常见问题

有报错

逗号,字段名,groupby没放在select中,分区等原因;具体看报错提示

无报错

i. 平时积累,常见的数据量级,比如DAU

ii. 与已有数据指标做对比,判断是否合理

无报错的错误通常是逻辑原因导致的,需要逐步排查出逻辑问题。

出错后的做法:

i. 简化

有约束条件的去掉约束条件,有多个表连接/嵌套的去掉连接/嵌套,只保留最简单的表格,

从最简单的情况开始测试,再不断往上添加条件,直到出错,从而定位到错误。

举个例子,table_a left join table_b出错,先分别检查table_a和table_b取出的数据是否正确,再检查join之后的结果

ii. 输出信息

输出信息是为了帮助我们更好地识别错误。

由于工作中使用的数据量通常比较大,可以采用输出行数,输出几条数据的方法更方便地帮助检查错误。

举个例子,table_a left join table_b出错,先看table_a有多少行,left join之后行数有没有变化

7. sql如何进行性能优化

EXPLAIN

在select 语句前加上explain,并不会真正执行sql语句,而是可查看sql的性能瓶颈信息,

针对性地进行优化;

区分in和exists

如果是exists,那么以外层表为驱动表,先被访问;

如果是IN,那么先执行子查询。

所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

避免在where子句中对字段进行null值判断

对于null的判断会导致引擎放弃使用索引而进行全表扫描。

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

in 和 not in 也要慎用,否则会导致全表扫描

避免在where子句中对字段进行表达式操作 / !=或<>操作符 / 对字段进行函数操作

将导致引擎放弃使用索引而进行全表扫描

尽量用union all代替union

7. 日期函数有哪些?——根据知乎喵宁一的文章整理

#数据人的面试交流地#
全部评论
很有用,感恩楼主
点赞 回复
分享
发布于 04-04 13:35 湖北

相关推荐

30 205 评论
分享
牛客网
牛客企业服务