大家在面试数据分析岗或其他岗位的时候,时常会被问到一些SQL题,我今天就将常被问到的一些SQL题及答案整理下,给大家做个参考!
案例所使用的表为:

(一)各种连接函数的区别?
(1)inner join
内连接。返回两个表的交集。根据两个表共有的列来匹配其中的行,强调只有两个表中共有的行对应的行才能匹配出来。

SELECT

tips:inner可以省略不写,可以连接后再去重,但是这么做的话,执行下来比较低,我们一般在做表连接之前,先去重。
(2)left join
左连接。以左表为基准,若右表中的对应行不满足条件,则结果会将右表中的这些值以null的形式匹配进来。(right join就是以右表为基准,和left join是相对应的)

SELECT

tips:如果需要的是左表独有的数据,可以使用where条件来过滤掉为null的值。
(3)cross join
交叉连接,结果是笛卡尔积,就是第一个表符合查询条件的行数乘以第二个表中符合查询的行数。

(4)full join(MySQL中没有,所以我没实现)
全连接。若左表有的数据,而右表中没有,而右表中有的数据,而左表中没有,这种情况会在结果中以空值的形式匹配出来。

tips:虽然MySQL中不支持全连接,但是可以使用union all来实现的。
(二)排序窗口函数?
row_number()、rank()、dense_rank(),这三个函数的作用都是返回相应规则的排序序号。
(1)row_number()
为查询出来的每一行记录都会生成一个序号,依次排序且不会重复。
语法:row_number() over(partition by 字段1 order by 字段2) # 字段1是分组的字段名称

(2)rank()
使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名排下一个,rank函数生成的序号有可能是不连续的,即排名可能为1,1,3,是跳跃式排名,有两个第一名时接下来就是第三名。
语法:rank() over(partition by 字段1 order by 字段2)

(3)dense_rank()
dense_rank函数在生成序号时是连续的,当出现相同排名时,将不跳过相同排名号,有两个第一名时仍跟着第二名,即排名为1,1,2这种。
语法:dense_rank() over(partition by 字段1 order by 字段2)

(三)on和where的区别?
数据库在连接多张表返回记录的时候,都会生成一个中间临时表。
(1)内连接:使用on或者where没有区别,过滤条件放在on或where中,其返回的结果是一样的。
(2)外连接(以左连接为例):
a. on是在生成临时表时使用的条件,不管on的条件是否为真,都会返回左表中的全部记录。
b. where是在临时表生成之后,再对临时表进行过滤的条件,这时已经没有left join的含义了,条件不为真的就全部过滤掉。
(四)主键和外键的区别?
(1)主键:是一张表中能够确定一条记录的唯一标志(数据库中的一条记录中有若干个属性,若某个属性组具有唯一标识一条记录的特性,那么该属性组就可以作为一个主键)。
(2)外键:用于和另外一张表进行关联。例如,A字段是A表中的主键,那么出现在B表中的A字段能够作为B表的外键,实现A,B表的连接查询。
(五)如何连接多个select?
草莓女孩:SQL中如何连接多个select?zhuanlan.zhihu.com(六)字符串常见操作函数?
草莓女孩:SQL中的字符串常见操作函数zhuanlan.zhihu.com(七) IN/EXIST的联系和区别?
这部分内容我写在了一个牛客网上的SQL题里了
草莓女孩:牛客网每日一练SQL题——使用含有关键字EXISTS查找未分配具体部门的员工的所有信息zhuanlan.zhihu.com(八)数据倾斜是什么?怎么解决?
大量相同的key被分配到同一个区内,一个节点承受着巨大的压力,而其他节点计算完毕后一直在等这个忙碌的节点,拖累了整体的计算时间,效率非常低。
如何解决?
- 使用小表在左,大表在右的,使用/ + map join(table) / 连接,假设表A为小表,B为大表
#
- 连接之前先用group by去重,尽量避免使用distinct
- 如果是由空值导致的数据倾斜,需要先过滤掉空值
最后,给大家推荐个写简历的好网站wondercv(不是应聘设计类的工作,简历模板不用太花哨,重要的是内容要丰富),我都是直接在上面修改的,很方便!
超级简历www.wondercv.com