作者 | 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种将死的编程语言
我去,同事居然用明文存储密码!!!
真香,朕在看了!

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

  1. sql索引面试_关于索引的25个最佳SQL面试问答

    sql索引面试 Q1:堆表和群集表之间有什么区别? 我们如何确定该表是否为堆表? (Q1: What is the difference between a Heap table and a Clus ...

  2. 33个必须知道的数据分析师SQL面试问题和答案

    33个必须知道的数据分析师SQL面试问题和答案 SQL是一种强大的编程语言,被广泛用于管理和分析数据.如果你想成为一名数据分析师,或者是正在寻找新工作的现有分析师,准备好回答SQL面试问题是很重要的. ...

  3. 常见的133个面试难题及解析

    133个面试难题及解析 第1章 面试开始提问 Q1.你能简单地谈一下你自己吗 ? Q2.请你自我介绍一下你自己? Q3.你觉得你个性上最大的优点是什么? Q4.说说你最大的缺点? Q5.你的好朋友(大 ...

  4. 面试者面试官,双向角度的程序员面试指南!

    作者 | Noj Vek  译者 | 弯月 出品 | 程序人生(ID:coder _life) 本文作者经历过 100 多场面试,而且也担任过 50 多场面试的面试官,我们一起来看一看他从面试者与面试 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试

    01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...

  6. 4000字干货长文!从校招和社招的角度说说如何准备大厂面试?

    插个题外话,为了写好这篇文章内容,我自己前前后后花了一周的时间来总结完善,文章内容应该适用于每一个学习 Java 的朋友!我觉得这篇文章的很多东西也是我自己写给自己的,比如从大厂招聘要求中我们能看到哪 ...

  7. 超全面试汇总——Hive 超详细!!!带答案!!!持续更新中~

    Hive面试总结 什么是 Hive ? Hive结构描述 Hive的优势 内部表.外部表.分区表.分桶表 hive中 排序的种类和适用场景 动态分区和静态分区的区别 + 使用场景 hive 语句执行顺 ...

  8. 兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

    前言 在今天,我收到了蚂蚁金服A级的实习录用offer. 从开始面试到拿到口头offer(四面技术+一面HR)战线大约拉了半个月, 从拿到口头offer到收到正式录用邮件大概又是半个月. 思前想后,决 ...

  9. 喜获蚂蚁offer,定级p7,面经分享,万字长文带你走完面试全过程

    前言 在今天,我收到了蚂蚁金服A级的实习录用offer. 从开始面试到拿到口头offer(四面技术+一面HR)战线大约拉了半个月, 从拿到口头offer到收到正式录用邮件大概又是半个月. 思前想后,决 ...

最新文章

  1. 根据listObject中的某个字段排序
  2. 软件发布版本的业界规则?
  3. socket套接字选项
  4. linux系统性能监视高级命令(12个)
  5. No injector for custom defined data type的解决办法
  6. 无失真压缩法可以减少冗余_机考样题(选择题带标准答案).docx
  7. jquery设置滚动条距离页面顶部的高度
  8. python int函数 向上取整_【Python小课】 print()函数
  9. 拓端tecdat|MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类
  10. GridView 72般绝技(一)
  11. Java中文乱码解决方式
  12. 查找 Mac 的机型名称和序列号四种方法
  13. 2018 ACM-ICPC Syrian Collegiate Programming Contest(部分题解,待补)
  14. Python学习日志12 - 办公自动化
  15. 既然有MySQL了,为什么还要有MongoDB?
  16. java nio rewind_java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别
  17. 又干起一起胡闹的事了,,,,,,,,
  18. 计算机动画的处理及应用教案,电脑动画制作教案(2篇)
  19. (转)2008年精典骗术, 2009年你还会上当吗?
  20. 2021年9月电子学会Python等级考试试卷(二级)考题解析

热门文章

  1. exoplayer 纯java,Exoplayer不播放任何视频
  2. 阿里云 服务器 系统 php mysql_阿里云服务器配环境(Ubuntu 16.04+Nginx+MySQL+PHP)并部署hexo博客...
  3. python中webdriver_Python自动化学习--Webdriver中的常用方法
  4. 钉钉如何调整组织架构_阿里调整组织架构:盒马升级为独立事业群,钉钉被划进阿里云丨钛快讯...
  5. oracle 时间集合,oracle 日期函数集合(集中版本)第2/2页
  6. 利用spi发送接收信息c语言,SPI接收发送函数程序
  7. hadoop重启后 9000端口不在
  8. 多行书写的字符串字面值
  9. C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
  10. Impala 调用Hbase 报错 LeaseException