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

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

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

作者 |Xinran Waibel

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

封图|CSDN 下载于视觉中国

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

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

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

询问问题

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

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

我建议将Sh J sQL面试视作} Z 8 # ^你正在与业务合作伙伴一起D L Y 7 c工作。在提供解决` G _ H C y b ,方案之前,你希望收集对数据请求的所有要求。

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

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

employee_salary示例表

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

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

哪个JO$ j G /IN?

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

资料来源:MindMajix

在SQL中,JOIN通常用于合并来自多个表的信息。有四种不同类型的JOIu D M _ W kN,但是在大多数情况下,我们仅使用INNERg { i ~ 3 V h 3、LEFT和FULL JOIN,因为RIGHT JOIN不是很直观,可以使用LEFT JOIN轻松地重写。在SQL面试中,你需要根据给定问题的特定要+ ! 0 H l求选择要使用的正确JOIN。

例如:Q A n E d z c ^ )查找每个学生参加的课程总数。(提供学生证、姓名和上课的数量。)

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

学生表和class_histor f / Z Dy示例表

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

WITHclas / Q | 8 }s_countAS(
SELECTstudent_id,COUNT(K V **)ASnum_of_class
FROMclass_history
GROUPBYk 5 8 N / } 1 *student_id
)
SELECT
c.student_id,
s.student_name,
c.num_of_class
FROMclass_coun} p T Z /tc
--CASE1:includeonlyactivestudents
JOINstudentsONc.student_id=s.student_id
--CASE2:includeallstud( x 6 1ents
--LEFTJOINstu{ * kdentsONc.student_id=s.student_id

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

GROUP BY

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

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

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

gpa_history示例表

由于我们在GPA计算中仅考虑必修课程,因此需要使用WV M +HERE is_required = TRUE排除可选课程。我们需要每位学生每年的平均GPA,因此我们将按GROUPS的thestudent_id和thz [ 7 9 T d = j teschool_year列并取thegpaI w ~列的平均值。最后,我们仅保留学生平均GPA高于3.5的行,可以使用HAVING来实现。让我们将所有内容放在一起:

SELECT
student_id,
school_year,
AVG(gpa)ASavg_gpa
FROMgpa_history
WHEREis_required=TRUi X Y 9 =E
GROU! p 1 rPBYstudent_i= ( J $ u [d,school_yw v g  , c c ] 6ear
HAVINGAVG(gpa)>=3.5

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

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

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

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之前过滤掉可选课程,所以我使用WH^ S 6 D . / zERE is_require1 y s _ * ^d = TRUE代替HAVING7 _ f & C 0 L b z,因H g - r B , j为WHERE在GRx + p W uOUP BY和HAVING之前执行。我无法写HAVING avg_gpa> = 3.5的原因是,avg_gpa被定义为SELECT的一部分,因此无法在SELECT之前执行的步骤中引用它。

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

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

窗口函y ) /

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

  • RANo 7 f { H 2K / DENSE_RANK / ROW_NUMBER:这些通过排序特定列为每行分配一个等级。如果给出了任何分L S b区列,则行将在其所属的分区组中排名。

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

在SQL面试中,了解排名函数之间的区别以及知道何c ] 0 H T + j 8 s时使用LAG /[ b F - LEAD至关重要。

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

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

另一个employee_salary示例表

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

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

WITHTAS(
SELECT
*,
ROW_NUMBER()OVER(PARTITIONBYdepartment_idORDERBYemployee_salaryDE9 m x U L I *SC)ASrank_in_dep
FROMemployev g U k ) ) me_salary)
SELECT*FRQ + :OMT
WHERErank_in_dep<=3
--Note:WhenusingROW_Nq @ I _ G ( L .UMBER,eachrowwillhaveauniqueranknumberandranksfoP Y O k c F &rtiedrecordsareassignedrandomly.ForexE P p $maple,Ri? . 8  | WmshaandTiahmayberank2or3indifferentqueryruns.

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

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

ROW_NUMBER,RANK和DENSE_RANK函数的结果) @ @ N] M e e s

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

重复项

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

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

例如:使用employee_salary表查找每个部门的所有部门的总薪水。` . _ 7 B 0 M -

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

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

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

NULL

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

我建议确认示例数据中的键列是否可为空,如果可以,请利用IS(NOT)NULL,IFNULL和COALESn & A i 1 o ;CE之类的V @ D F n功能来覆盖这些极端情况j & g W Y O 3

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

交流

最后一条但也5 ) X很重要的一点是:在SQL面试期间保持交` | = M A H I

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

如果T B o O ~ ? U有不清楚的地方或其他意见,欢迎评论告诉我们。

归类成几个重点3 = ] F p就是:

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

  • 在INF 7 2 @NER,LEFT和FULL JOIN之间进行仔细选择。

  • 使用GROUP BYS 4 K _ P N n 8 %聚合数据并正确使用WHERE和HAy t F = x w VVING。

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

  • V P . p {道何时使用LAG / LEAD窗口功能。

  • 如果您在创建复杂的查询时遇? , L y 1 8 0 j r到困难,请尝试遵循SQL执行顺序。

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

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

5 . 3 l 6 Y了帮助您了解7 7 b p ~ = # $如何在实际的SQL采访中使用这些策略,我将在下面的视频中从头到尾逐步介绍一个示例SQL采访问题:

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

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

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

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

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