破解面试难题8个角度带你解读SQL面试技巧!

作者 | Xinran Waibel

译者 | 天道酬勤 责编 | 徐威龙

封图| CSDN 下载于视觉中国

SQL是用于数据分析和数据处理的最重要的编程语言之一,因此SQL问题始终是与数据科学相关工作(例如数据分析师、数据科学家和数据工程师)面试过程中的一部分。  SQL面试旨在评估应聘者的技术和解决问题的能力。因此,至关重要的是,不仅要根据样本数据编写正确的查询语句,而且还要像对待现实数据集一样考虑各种情况和极端情况。

作者曾帮助设计和执行针对数据科学面试者的SQL面试问题,并亲自为大型技术公司和初创公司进行了许多SQL面试。在这篇文章中,作者将解释SQL面试问题中常见的模式,并提供有关如何在SQL查询中巧妙处理它们的技巧。

 

询问问题

 

要搞定SQL面试,最重要的是通过询问所需的尽可能多的问题来确保拥有给定任务和数据样本的所有详细信息。理解需求可以节省你以后迭代问题的时间,并使你能够很好地处理极端情况。 

我注意到许多面试候选者往往不了解SQL问题或数据集就直接进入解决方案。后来,在我指出解决方案中的问题之后,他们不得不重复修改查询。最后,他们在迭代中浪费了很多面试时间,甚至可能还没有找到正确的解决方案。

我建议将SQL面试视作你正在与业务合作伙伴一起工作。在提供解决方案之前,你希望收集对数据请求的所有要求。

例如:查找薪水最高的前3名员工。      

employee_salary示例表

你应要求面试官解释清楚“前三名”的含义。我应该在结果中包括3名员工吗?你要我如何处理关系?此外,请仔细查看样本员工数据。薪水字段的数据类型是什么?在计算之前是否需要清除数据?

 

哪个JOIN?

             

资料来源:MindMajix

在SQL中,JOIN通常用于合并来自多个表的信息。有四种不同类型的JOIN,但是在大多数情况下,我们仅使用INNER、LEFT和FULL JOIN,因为RIGHT JOIN不是很直观,可以使用LEFT JOIN轻松地重写。在SQL面试中,你需要根据给定问题的特定要求选择要使用的正确JOIN。

 例如:查找每个学生参加的课程总数。(提供学生证、姓名和上课的数量。)

学生表和class_history示例表

你可能已经注意到,并非所有出现在class_history表中的学生都出现在学生表中,这可能是因为这些学生已不再注册。  (这在事务数据库中实际上是非常典型的,因为记录通常在不活动时会被删除。)根据面试官是否希望结果中的不活动学生,我们需要使用LEFT JOIN或INNER JOIN来组合两个表:

WITH class_count AS (SELECT student_id, COUNT(*) AS num_of_classFROM class_historyGROUP BY student_id
)
SELECTc.student_id,s.student_name,c.num_of_class
FROM class_count c
-- CASE 1: include only active students
JOIN student s ON c.student_id = s.student_id
-- CASE 2: include all students
-- LEFT JOIN student s ON c.student_id = s.student_id

GROUP BY

 

GROUP BY是SQL中最重要的功能,因为它广泛用于数据聚合。如果在SQL问题中看到诸如求和、平均值、最小值或最大值之类的关键字,则表明你可能应该在查询中使用GROUP BY。一个常见的陷阱是在过滤数据和GROUP BY时混合使用WHERE和HAVING,我见过很多人会犯此错误。

例如:计算每个学生在每个学年中平均所需的课程GPA,并找到每个学期符合Dean's List(GPA≥3.5)资格的学生。

gpa_history示例表

由于我们在GPA计算中仅考虑必修课程,因此需要使用WHERE is_required = TRUE排除可选课程。我们需要每位学生每年的平均GPA,因此我们将按GROUPS的thestudent_id和theschool_year列并取thegpa列的平均值。最后,我们仅保留学生平均GPA高于3.5的行,可以使用HAVING来实现。让我们将所有内容放在一起:

SELECTstudent_id,school_year,AVG(gpa) AS avg_gpa
FROM gpa_history
WHERE is_required = TRUE
GROUP BY student_id, school_year
HAVING AVG(gpa) >= 3.5

注意,每当在查询中使用GROUP BY时,你都只能选择“分组依据”列和聚合列,因为其他列中的行级信息已被舍弃。

有些人可能想知道WHERE和HAVING之间有什么区别,或者为什么我们不只是写HAVING avg_gpa> = 3.5而未指定函数。我将在下一节中详细解释。

 

SQL查询执行顺序

 

多数人从SELECT开始从上到下编写SQL查询,但是你知道SELECT是SQL引擎执行的最后一个函数之一吗?以下是SQL查询的执行顺序:

  1. FROM, JOIN

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. DISTINCT

  7. ORDER BY

  8. LIMIT, OFFSET

再次考虑前面的示例。因为我们想在计算平均GPA之前过滤掉可选课程,所以我使用WHERE is_required = TRUE代替HAVING,因为WHERE在GROUP BY和HAVING之前执行。我无法写HAVING avg_gpa> = 3.5的原因是,avg_gpa被定义为SELECT的一部分,因此无法在SELECT之前执行的步骤中引用它。

我建议在编写查询时遵循执行顺序,这在你编写复杂查询时会很有帮助。

              

窗口函数

 

窗口函数也经常出现在SQL面试中。共有五种常见的窗口函数:

  • RANK / DENSE_RANK / ROW_NUMBER:这些通过排序特定列为每行分配一个等级。如果给出了任何分区列,则行将在其所属的分区组中排名。

  • LAG / LEAD:它根据指定的顺序和分区组从前一行或后一行检索列值。

在SQL面试中,了解排名函数之间的区别以及知道何时使用LAG / LEAD至关重要。 

例如:查找每个部门中薪水最高的前3名员工。

另一个employee_salary示例表

当一个SQL问题要求输入“ TOP N”时,我们可以使用ORDER BY或等级函数来回答该问题。但是,在此示例中,它要求计算“每个Y中的TOP N X”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。

以下查询恰好找到3个薪水最高的员工,而不论他们的关系如何:

WITH T AS (
SELECT*,ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_salary DESC) AS rank_in_dep
FROM employee_salary)
SELECT * FROM T
WHERE rank_in_dep <= 3
-- Note: When using ROW_NUMBER, each row will have a unique rank number and ranks for tied records are assigned randomly. For exmaple, Rimsha and Tiah may be rank 2 or 3 in different query runs.

此外,根据应如何处理关系,我们可以选择其他排名函数。同样,细节很重要!

ROW_NUMBER,RANK和DENSE_RANK函数的结果比较

重复项

 

SQL面试中的另一个常见陷阱是忽略数据重复。尽管样本数据中的某些列似乎具有不同的值,但还是希望面试者考虑所有可能性,就像他们在处理真实数据集一样。例如,在上一个示例的employee_salary表中,可以让雇员共享相同的名称。

避免重复引起的潜在问题的一种简单方法是始终使用ID列唯一地标识不同的记录。

例如:使用employee_salary表查找每个部门的所有部门的总薪水。

正确的解决方案是GROUP BY employee_id,然后使用SUM(employee_salary)计算总工资。如果需要雇员姓名,请在末尾与雇员表联接以检索雇员姓名信息。

错误的方法是使用GROUP BY employee_name。

 

NULL

在SQL中,任何谓词都可以产生三个值之一:true,false和NULL,这是用于未知或缺失数据值的保留关键字。处理NULL数据集可能会出乎意料的棘手。在SQL面试中,面试官可能会特别注意你的解决方案是否处理了NULL值。有时很明显,如果一列不可为空(例如ID列),但是对于大多数其他列,很有可能会有NULL值。

我建议确认示例数据中的键列是否可为空,如果可以,请利用IS(NOT)NULL,IFNULL和COALESCE之类的功能来覆盖这些极端情况。

交流

 

最后一条但也很重要的一点是:在SQL面试期间保持交流。 

我面试了许多面试者,他们几乎没有说话,除非他们有疑问,如果他们最终提出了完美的解决方案,那就没问题了。但是,在技术面试过程中保持交流通常是一个方法。例如,你可以谈论你对问题和数据的理解,计划如何解决问题,为什么使用某些功能而不是其他替代方法以及正在考虑哪些极端情况。

如果有不清楚的地方或其他意见,欢迎评论告诉我们。

 归类成几个重点就是:

  • 保持主动提问,以保证可以先了解所需要知道的细节

  • 在INNER,LEFT和FULL JOIN之间进行仔细选择。

  • 使用GROUP BY聚合数据并正确使用WHERE和HAVING。

  • 了解这三个排名功能之间的差异。

  • 知道何时使用LAG / LEAD窗口功能。

  • 如果您在创建复杂的查询时遇到困难,请尝试遵循SQL执行顺序。

  • 考虑潜在的数据问题,例如重复和NULL值。

  • 与面试官沟通您的思维过程。

为了帮助您了解如何在实际的SQL采访中使用这些策略,我将在下面的视频中从头到尾逐步介绍一个示例SQL采访问题:

视频连接:https://youtu.be/EjETvPfiwYw

原文:https://towardsdatascience.com/crack-sql-interviews-6a5fc90ec763

推荐阅读:还不知道 AWS 是什么?这 11 个重点带你认识 AWS !
数据库连接池的原理没你想得这么复杂
为什么程序员如此“嫌弃”主干开发模式?
智能合约编写之 Solidity 的设计模式
2020年,5种将死的编程语言
我去,同事居然用明文存储密码!!!
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂架构整洁之道(附知识脉络图)

程序的世界飞速发展&#xff0c;今天所掌握的技能可能明年就过时了&#xff0c;但有一些东西是历久弥新&#xff0c;永远不变的&#xff0c;掌握了这些&#xff0c;在程序的海洋里就不会迷路&#xff0c;架构思想就是这样一种东西。 本文是《架构整洁之道》的读书笔记&#xf…

python获取视频时长方法

1.使用subprocess和re import re import subprocess video r"work/train/video/a8b96f016a28d8f3836f7cbb7734ecde.mp4" import subprocessdef get_length(filename):result subprocess.run(["ffprobe", "-v", "error", "-sho…

阿里敏捷教练全面解析淘宝直播敏捷实践之路

背景介绍 阿里很少提敏捷转型或DevOps&#xff0c;阿里是强业务驱动的&#xff0c;不管用什么办法&#xff0c;一定要达到业务目标。 我来自敏捷教练团队&#xff0c;我们的职责是帮助团队拿结果。这里的团队不限于研发团队&#xff0c;我现在支持的团队包括销售团队和产品运…

int默认值为0,Integer默认值为null

前提概要 Java为每个原始类型提供了封装类&#xff0c;Integer是java为int提供的封装类。 int的默认值为0&#xff0c;而Integer的默认值为null&#xff0c;即Integer可以区分出未赋值和值为0的区别&#xff0c;int则无法表达出未赋值的情况。 代码示例 public class…

GitHub 接连封杀开源项目惹众怒,CEO 亲自道歉!

作者 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;王坚博士曾经做过这样一个非常形象的比喻&#xff0c;他将做 App 比作是在别人的花园里弄盆栽&#xff0c;「种点花草是没有问题的」&#xff0c;不过「别人叫你的产品下架你…

一键托管,阿里云全链路追踪服务正式商用:成本仅自建1/5或更少

随着互联网架构的扩张&#xff0c;分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用&#xff0c;这些组件共同构成了繁杂的分布式网络。 在一次800多人的开发者调研中&…

基于Docker的Mysql主从复制搭建_mysql5.7.x

文章目录为什么基于Docker搭建&#xff1f;一、拉取镜像创建容器1. 拉取mysql:5.7镜像2. 创建master容器3. 创建slave容器4. 查看正在运行的容器5. 此时可以使用Navicat等工具测试连接mysql二、搭建Master(主)服务器2.1. 进入到Master容器内部2.2. my.cnf编辑2.2. 重启mysql服务…

医疗保健、零售、金融、制造业……一文带你看懂大数据对工业领域的影响!...

作者 | Zubair Hassan译者 | 风车云马 责编 | 徐威龙封图| CSDN 下载于视觉中国随着大数据技术的兴起&#xff0c;工业领域在很大程度上发生了变化。智能手机和其他通讯方式的使用迅速增加&#xff0c;使得每天都能收集大量数据。以下是大数据对工业领域的影响。如今&#xff0…

mysql主从复制排错

使用start slave开启主从复制过程后&#xff0c;如果SlaveIORunning一直是Connecting&#xff0c;则说明主从复制一直处于连接状态&#xff0c;这种情况一般是下面几种原因造成的&#xff0c;我们可以根据 Last_IO_Error提示予以排除。 可能的原因说明网络不通查看master和sla…

揭秘!一个高准确率的Flutter埋点框架如何设计

背景 用户行为埋点是用来记录用户在操作时的一系列行为&#xff0c;也是业务做判断的核心数据依据&#xff0c;如果缺失或者不准确将会给业务带来不可恢复的损失。闲鱼将业务代码从Native迁移到Flutter上过程中&#xff0c;发现原先Native体系上的埋点方案无法应用在Flutter体…

如何运行没有Root权限的Docker?干货来了!

作者 | Vaibhav Raizada译者 | 天道酬勤责编 | 徐威龙封图| CSDN 下载于视觉中国在本文中&#xff0c;我们讨论了如何在没有root权限的情况下运行Docker&#xff0c;以便更好地管理容器中的安全性。Docker作为Root用户Docker以root用户身份运行其容器。但是你的工作负载真的需要…

搭建主从数据库出现的错误 error connecting to master ‘slave@172.17.0.2:3306‘ - retry-time: 30 retries: 1

在搭建主从数据库的时候出现了报错 出现错误的截图&#xff1a; 解决办法&#xff1a; 重新授权 CREATE USER slave% IDENTIFIED BY 123456; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave%;参考链接: 搭建主从数据库出现的错误error connecting to master …

Java-For循环

public class ForDemo01 {public static void main(String[] args) {int a 1; // 初始化条件while (a<100){ // 条件判断System.out.println(a);a2;}System.out.println("while 循环结束&#xff01;");// 初始化 // 条件判断 // 迭代for(int i1;i<100;i){S…

spring.shardingsphere.rules.sharding.sharding-algorithms.database_inline.props‘ is not valid

spring.shardingsphere.rules.sharding.sharding-algorithms.database_inline.props is not valid 解决方案&#xff1a; 原配置 修改后

以云战“疫”,这次阿里云又让人们惊了……

本文转载自CSDN博主「L-JingJing」的原创文章 近日&#xff0c;阿里云对外宣布其容器服务调度GPU云服务器启动加速计算&#xff0c;最快只需60秒即可完成新冠病毒的核酸对比工作&#xff1b;同时将向医疗科研机构、疾控中心等一线病毒研究机构免费开放基因计算服务&#xff0c…

Java-增强for循环

public class ForDemo05 {public static void main(String[] args) {int[] numbers {10, 20, 30, 40}; // 定义一个数组for (int number : numbers) {System.out.println(number);}} }https://www.bilibili.com/video/BV12J41137hu?p42&spm_id_frompageDriver

五年从P5到P8,在阿里学做个靠谱的人

师兄文化&#xff0c;是阿里的老传统&#xff0c;新人入职都要认个师兄。 不是江湖上这种师兄哈&#xff0c;但帅是一样帅的 今天和大家聊聊我在阿里当师兄的故事。 我是“改之”&#xff0c;不是“有则改之无则加勉”的改之&#xff0c;而是“杨过&#xff0c;字改之”的那…

@开发者,微软 CEO 萨提亚带领 60 位大咖的集结令,你敢接吗?

2020年初&#xff0c;一场突如其来的疫情打乱了所有人的脚步&#xff0c;给人们的生活、工作、学习带来诸多不便&#xff0c;与此同时&#xff0c;我们看到一些企业迅速响应&#xff1a;各式买菜小程序、远程工具、在线教育的火爆……这背后&#xff0c;是企业的数字化转型步伐…

支付宝技术风险负责人陈亮:把事情做到极致,技术的差异性才会体现出来

“很多事情&#xff0c;说出来很多人都在做&#xff0c;但是只有真正做到极致&#xff0c;技术的差异性才会体现出来”&#xff0c;蚂蚁金服技术风险部研究员陈亮&#xff08;花名&#xff1a;俊义&#xff09;在接受 InfoQ 采访时如是说道。在此前的支付宝技术嘉年华&#xff…

Java-break-continue

https://www.bilibili.com/video/BV12J41137hu?p43&spm_id_frompageDriver