当前位置:网站首页>数据分析面试手册《SQL篇》
数据分析面试手册《SQL篇》
2022-08-11 00:35:00 【二哥不像程序员】
前言
最近互联网行业进入了工作变动的高峰期,很多读者对于数据分析的面试题不知道如何进行解答,本文开始二师兄将连载《数据分析面试手册》来帮助大家!
在当前的数据分析岗位中,多数人在做着SQL-Boy\SQL-Girl的工作,在数据分析面试中,SQL是必不可少的一环,对于SQL不仅有常见函数用法的考察,更多时候面试官喜欢出一些编程类题目,本文我们来了解一下那些典型的SQL面试题。(文中的问题均以MySQL为例)
简述类题
Q1:MySQL排序窗口函数的区别?
考频:
难度:
- ROW_NUMBER():按照顺序进行排序(1、2、3…)
- RANK():并列排序,会跳过重复的序号(1、1、3…)
- DENSE_RANK():并列排序,不会跳过重复的序号(1、1、2…)
Q2:如何进行MySQL优化?
考频:
难度:
SQL进行优化的方式多种多样,这里列出10种常见方法:
- 使用select具体字段代替select*
- 查询结果数量已知时,使用limit限定
- 尽量避免使用in和not in(可以使用between和exists)
- 尽量避免使用or(可用union代替)
- 尽量避免进行null值判断(可用0去填充然后判断)
- 大表驱动小表(in的时候左大右小,exists左小右大)
- join的表不宜过多(一般不超过3个)
- 先缩小数据范围,再进行其他操作
- 针对条件筛选列添加索引
- 使用group by代替distinct进行去重
Q3:MySQL中三left join\right join\inner join的区别?
考频:
难度:
左外连接(left join):将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。
右外连接(right join):将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分
内连接(inner join):两表同时满足ON后的条件的部分才会列出
编程类题
完成编程题的时候,不要被SQL优化的思维固化,这种题目在保证速度和准确率的基础上再去考虑优化方案
下面选出的5道题目对应着4种常考的SQL类型:查询类、合并类、排序类、字符串提取类。小伙伴们可以根据题目总结类似题目的解题思想。
注:写SQL代码是多数公司必不可少的一环,毕竟实践是检验真理的唯一标准。
Q1:第二高的薪水
考频:
难度:
题目
给定一个如下定义的数据表,编写查询语句获取并返回 Employee
表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null
。
字段名 | 数据类型 |
---|---|
id | int |
salary | int |
示例:
输入:Employee表
id | salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
输出:
SecondHighestSalary |
---|
200 |
答案
select ifnull((
select distinct salary
from Employee
order by salary Desc limit 1,1),null) as SecondHighestSalary;
解析
该题是一道经典的查询类问题,很多的场景下我们需要查找第n高的数据,较为简便的方式就是使用limit(x,y)
进行查询,x是定位到第n个数据,y是从x的位置开始显示多少数据。因此本题需要对数据进行从大到小的排序,然后进行limit(1,1)
限制,也就表示从第2大的数据开始显示一个数据。
因为题目中给出查不到需要显示null因此使用ifNull(查询,null)
的方式完成。
Q2:上升的温度
考频:
难度:
题目
给定一个如下定义的数据表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id
。
字段名 | 数据类型 |
---|---|
id | int |
recordDate | date |
temperature | Int |
示例
id | recordDate | temperature |
---|---|---|
1 | 2015-01-01 | 10 |
2 | 2015-01-02 | 25 |
3 | 2015-01-02 | 20 |
4 | 2015-01-04 | 30 |
输出
id |
---|
2 |
4 |
答案
select u.id
from Weather u, Weather v
where datediff(u.recordDate,v.recordDate)=1 and u.Temperature > v.Temperature;
解析
本题是一个合并类的题目,我们需要进行前后日期的比较,对于该类比较我们可以对日期做差来完成,对于给定的数据表赋予两个别名得到两个相同的表u和v,对u和v的日期进行做差,如果差值为1则证明正在比较’今天和明天’的数据,此时再对温度做差得到结果即可。
Q3:删除重复的电子邮箱
考频:
难度:
题目
给定一个如下定义的数据表,编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
字段名 | 数据类型 |
---|---|
id | int |
Archer |
示例
id | |
---|---|
1 | [email protected] |
2 | [email protected] |
3 | [email protected] |
输出
id | |
---|---|
1 | [email protected] |
2 | [email protected] |
答案
delete from person
where id not in (
select id from (select min(id) as id from person group by email) as t
)
解析
本题是一道排序类题目,我们要进行重复值的删除并且保留ID最小的那一条数据,此时我们只需要找到每一个最小的ID进行保留即可,因此使用min(id)
找到每条数据最小的id,将所有的最小id作为id池,后续只要id不在里面就进行删除即可。
除了上述方法,还有比较简单的建立双表,直接找到email相同且id较大的数据进行删除,代码如下:
delete u
from Person u , Person v
where v.id < u.id and u.email = v.email
Q4:分数排名
考频:
难度:
题目
给定如下的表格,编写SQL查询对分数进行排序。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。
字段名 | 数据类型 |
---|---|
id | int |
score | decimal |
示例
id | score |
---|---|
1 | 3.50 |
2 | 3.65 |
3 | 4.00 |
4 | 3.85 |
5 | 4.00 |
6 | 3.65 |
输出
Score | Rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
答案
select score,dense_rank() over(order by Score desc) as 'rank'
from Scores;
解析
这是一个考察排序的题目,mysql出现窗口函数之后对于此类问题的解答就简单了许多,不难理解上述答案。但是需要思考的是如果在不使用窗口函数的情况下我们如何完成呢?
Q5:患某种疾病的患者
考频:
难度:
题目
给定如下的数据表,写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。
按任意顺序返回结果表。
字段名 | 数据类型 |
---|---|
patient_id | int |
patient_name | varchar |
conditions | varcher |
示例
patient_id | patient_name | conditions |
---|---|---|
1 | Daniel | YFEV COUGH |
2 | Alice | |
3 | Bob | DIAB100 MYOP |
4 | George | ACNE DIAB100 |
5 | Alain | DIAB201 |
输出
patient_id | patient_name | conditions |
---|---|---|
3 | Bob | DIAB100 MYOP |
4 | George | ACNE DIAB100 |
答案
select *
from Patients where conditions like 'DIAB1%' or conditions like '% DIAB1%';
解析
该题是一道典型的字符串提取类题目,对于字符串我们需要掌握字符串的截取、模糊查询、位置查找等操作,对于本题我们使用连续的模糊查询进行筛选即可。
边栏推荐
- 微信小程序获取当前页面的url和参数
- HW-蓝队工作流程(1)
- "NIO Cup" 2022 Nioke Summer Multi-School Training Camp 4 ADHK Problem Solving
- How to easily obtain the citation format of references?
- [Excel知识技能] 将文本型数字转换为数值格式
- 2022.8.10-----leetcode.640
- How to do patent mining, the key is to find patent points, in fact, it is not too difficult
- 【爬虫】scrapy创建运行爬虫、解析页面(嵌套url)、自定义中间件(设置UserAgent和代理IP)、自定义管道(保存到mysql)
- 报错:Client does not support authentication protocol requested by server; consider upgrading MySQL cli
- 两个链表的第一个公共节点——LeetCode
猜你喜欢
[Data Visualization] Chart Design Principles
In 22 years, the salary of programmers nationwide in January was released, only to know that there are so many with annual salary of more than 400,000?
异常:try catch finally throws throw
使用mysql语句操作数据表(table)
时间戳转换为日期格式、获取当前时间戳
Word set before the title page
分布式.性能优化
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 3 DF Problem Solving
地下管廊可视化管理系统搭建
池化技术有多牛?来,告诉你阿里的Druid为啥如此牛逼!
随机推荐
YOLOv5的Tricks | 【Trick13】YOLOv5的detect.py脚本的解析与简化
22/8/9 贪心问题合集
YOLOv5的Tricks | 【Trick11】在线模型训练可视化工具wandb(Weights & Biases)
[数据可视化] 图表设计原则
【C语言】探索数据的存储(整形篇)
如何利用原生JS实现回到顶部以及吸顶效果
“蔚来杯“2022牛客暑期多校训练营2 DGHJKL题解
LeetCode_优先级队列_692.前K个高频单词
异常:try catch finally throws throw
How to build speed, speed up again
云原生-VMware虚拟机安装Kubesphere实战(一)
Dump文件生成,内容,以及分析
In 22 years, the salary of programmers nationwide in January was released, only to know that there are so many with annual salary of more than 400,000?
Pico 4更多参数曝光:Pancake+彩色透视,还有Pro版本
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 2 DGHJKL Problem Solution
input输入框超出部分用省略号表示以及判断内容是否有超出(PC端)
Ali P7 bask in January payroll: hard to fill the, really sweet...
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 3 DF Problem Solving
全排列思路详解
如何做到构建的提速,再提速