当前位置: 首页 > 面试经验 >

SQL面试题与解析1-知识点考察

优质
小牛编辑
160浏览
2023-03-28

SQL面试题与解析1-知识点考察




面试高频题1:


题目:讲一下Union和Join的区别


答案解析:


UNION是两张表进行上下拼接,产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集,分为UNION和UNION ALL两种方法;


JOIN 是两张表进行左右连接,条件匹配的记录将合并产生一个记录集,有LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN等多种方法。



面试高频题2:


题目:说一下SQL窗口函数并举例


答案解析:


1.窗口函数 窗口函数和普通聚合函数的区别: ①聚合函数是将多条记录聚合为⼀条;窗⼝函数是每条记录都会执行,有几条记录执行完还是几条。 ②聚合函数也可以⽤于窗⼝函数。 原因就在于窗⼝函数的执⾏顺序(逻辑上的)是在FROM,JOIN,WHERE, GROUP BY,HAVING之后,在ORDER BY,LIMIT,SELECT DISTINCT之前。它 执⾏时GROUP BY的聚合过程已经完成了,所以不会再产⽣数据聚合。 注:窗口函数是在where之后执行的,所以如果where子句需要用窗口函数作为条件,需要多⼀层查询,在子查询外面进行,例如: select user_id,avg(diff) from ( select user_id,lead(log_time)over(partition user_id order by log_time) - log_time as diff from user_log )t where datediff(now(),t.log_time)<=30 group by user_id 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 为当前窗⼝的记录总⾏数 --给窗口指定别名:WINDOW w AS(PARTITION BY stu_id ORDER BY score) rows =5 mysql> SELECT -> RANK() OVER w AS rk, -> PERCENT_RANK()OVER w AS prk, -> stu_id,lesson_id,score -> FROM t_score -> WHERE stu_id=1 -> WINDOW w AS (PARTITION BY stu_id ORDER BY score) -> ; +----+-----+--------+-----------+-------+ | rk | prk | stu_id | lesson-id | score | +----+-----+--------+-----------+-------+ | 1 | 0 | 1 | L003 | 79 | | 2 | 0.25| 1 | L002 | 86 | | 3 | 0.5| 1 | L004 | 88 | | 4 | 0.75| 1 | L005 | 98 | | 5 | 0.75| 1 | L001 | 98 | +----+-----+--------+-----------+-------+ cume_dist(): 分组内⼩于、等于当前rank值的⾏数/分组内总⾏数 eg:查询⼩于等于当前成绩(score)的⽐例 --cd1: 没有区分,则所有数据均为一组,总行数为8 --cd2: 按照lesson_id分成了两组,行数各为4 mysql> SELECT stu_id,lesson_id,score -> CUME_DIST() OVER (ORDER BY score) AS cd1, -> CUME_DIST() OVER (PARTITION BY lesson_id ORDER BY score) AS cd2 -> FROM t_score -> WHERE lesson_id IN('L001','L002') -> ; +--------+-----------+-------+-------+------+ | stu_id | lesson_id | score |



 类似资料: