SQL高频面试题及答案!
1、UNION和JOIN的区别(滴滴、京东)
参考答案
UNION是两张表进行上下拼接,产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集,分为UNION和UNION ALL两种方法;JOIN 是两张表进行左右连接,条件匹配的记录将合并产生一个记录集,有LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN等多种方法。
答案解析
(1)UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。若要对结果去重,可用 UNION 方法;如果允许存在重复的值,使用 UNION ALL。
示例:
table1:
table2:
要求:从table1 和 table2 中选取所有的中国(CN)的数据(允许存在重复的值)
结果:
(2)JOIN
JOIN 用于把来自两个或多个表的行结合起来。下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
2、Sql题目,求连续访问ID(猿辅导)
参考答案
现有用户访问登陆表log_table,记录了usr_id和访问日期:
求连续访问ID的问题可以转化为寻找有过连续3天以上访问记录usr_id的问题,具体代码如下:
3、sql窗口函数并举例(滴滴、网易)
参考答案
1.窗口函数
窗口函数和普通聚合函数的区别:
①聚合函数是将多条记录聚合为⼀条;窗⼝函数是每条记录都会执行,有几条记录执行完还是几条。
②聚合函数也可以⽤于窗⼝函数。
原因就在于窗⼝函数的执⾏顺序(逻辑上的)是在FROM,JOIN,WHERE, GROUP BY,HAVING之后,在ORDER BY,LIMIT,SELECT DISTINCT之前。它 执⾏时GROUP BY的聚合过程已经完成了,所以不会再产⽣数据聚合。
注:窗口函数是在where之后执行的,所以如果where子句需要用窗口函数作为条件,需要多⼀层查询,在子查询外面进行,例如:
2.窗口函数的基本用法:
over关键字用来指定函数执⾏的窗⼝范围,若后⾯括号中什么都不写,则意味着窗口包含满足WHERE条件的所有行,窗口函数基于所有行进行计算;如果不为空,则⽀持以下4中语法来设置窗⼝。
①window_name:给窗口指定⼀个别名。如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读
②partition by子句:窗口按照哪些字段进⾏分组,窗⼝函数在不同的分组上分别执⾏
③order by子句:按照哪些字段进⾏排序,窗⼝函数将按照排序后的记录顺序进⾏编号
④frame子句:frame是当前分区的⼀个子集,子句⽤来定义子集的规则,通常⽤来作为滑动窗⼝使⽤
3.(⾯试考点)序号函数:row_number(),rank(),dense_rank()的区别
ROW_NUMBER():顺序排序——1、2、3
RANK():并列排序,跳过重复序号——1、1、3
DENSE_RANK():并列排序,不跳过重复序号——1、1、2
4.分布函数:percent_rank(),cume_dist()
percent_rank(): 每⾏按照公式 (rank-1) / (rows-1) 进⾏计算。其中,rank为RANK()函数产⽣的序号,rows 为当前窗⼝的记录总⾏数
cume_dist(): 分组内⼩于、等于当前rank值的⾏数/分组内总⾏数
eg:查询⼩于等于当前成绩(score)的⽐例
5.前后函数:lag(expr,n),lead(expr,n)
用途:返回位于当前行的前n行( LAG(expr,n) )或后n⾏ ( LEAD(expr,n) )的expr的值
应用场景:查询前1名同学的成绩和当前同学成绩的差值
6.头尾函数:FIRST_VALUE(expr),LAST_VALUE(expr)
⽤途:返回第⼀个(FIRST_VALUE(expr) )或最后⼀个( LAST_VALUE(expr) )expr的值
应用场景:截⽌到当前成绩,按照⽇期排序查询第1个和最后1个同学的分数
4、SQL里面的like的用法(滴滴)
参考答案
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
示例:
table1:
要求:从table1中选取以G开头的网站数据(允许存在重复的值)
结果:
5、SQL留存问题:现场写一道SQL:给定用户表,求用户的次日留存率(快手、oppo)
假设usrlogs用户表记录了用户的登陆日期,如下:
首先计算用户登陆的日期间隔,并写入临时表date_interval:
然后根据用户登陆的日期间隔筛选出留存的用户,从而计算出次日留存及次日留存率:
次日留存考虑的是某日登陆的用户次日依旧登陆的用户量及比率,而三日和七日分别考虑的是某日登陆的用户三日和七日后登陆的用户量及比率,因此只需将上述代码中day_diff日期间隔设置为3、7即可计算出三日和七日留存及留存率。
#面经##网易##京东##滴滴##猿辅导##数据分析师#