全文共3006字,预计学习时长13分钟

图源:unsplash

SQL是数据分析和处理最基本的编程语言之一,因此,无论是面试数据分析师、数据科学家、数据工程师,还是其他相关工作,都免不了要过这一关。

实战技术和解决问题的能力是SQL面试中考察的重点,应聘者不仅要基于示例数据编写正确的查询,还要考虑各种场景和边缘情况,就如同在处理实际数据集。

笔者曾经帮助求职者设计过SQL面试问题,并模拟了面试,也多次亲身参加了大型科技公司和初创企业SQL求职面试的实战。本文将对SQL面试问题的常见模式进行阐释,分享在SQL查询中灵活处理这些模式的技巧。

快掏出小本本开始学习吧~

提问

要拿下一场SQL面试,最重要的在于尽可能多地提问,以确保自己掌握了给定任务和数据样本的所有细节。理解这些需求有助于节省迭代问题的时间,也有助于更好地处理边缘情况。

图源:unsplash

许多应聘者会在没有深入理解SQL问题或数据集之前,直接开始解决问题。在笔者指出解决方案中的问题之后,他们不得不反复修改查询,在迭代上浪费了大量时间,甚至到最后都没找到正确的解决方案。

笔者的建议是将SQL面试视为在与业务合作伙伴一起工作,保持这种心态,面试者就会在提供解决方案之前努力收集数据请求的所有需求。

示例

从下表中找出薪资最高的三位职员。

样本:职员薪资表

面试者应该让面试官仔细阐述“前三名”的概念——结果中必须只有三名职员吗?对于并列的处理有何要求?此外,面试者应仔细查看示例职员的数据——薪资字段的数据类型是什么?需要在计算之前清除数据吗?

何种连接

在SQL中,连接经常用于组合来自多个表的信息。共有四种不同类型的连接,但是在大多数情况下,我们只使用自然连接、左连接和全连接,因为右连接并不直观,而且使用左连接很容易重写。在SQL面试中,面试者需要根据给定问题的特定要求,选择正确的连接。

示例

找出每位学生上课的总节数。(已知学生证、姓名和上课次数。)

样本:学生名单和课程数据表

可以注意到,并非所有出现在课程数据表中的学生都存在于学生名单中,这可能是因为这些学生已经毕业(这在事务数据库中非常典型,数据不活跃时就会被删除)。在了解清楚面试官是否希望将不活跃的学生包括在内之后,可以根据情况使用左连接和自然连接两种方式来合并表格。

WITHclass_count AS (SELECT student_id, COUNT(*) ASnum_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问题中出现了sum、average、minimum或maximum等关键字,则极有可能应该在查询中使用GROUP BY。一个常见的陷阱是,在用GROUP BY过滤数据时将WHERE和HAVING混淆——许多人都犯过这个错误。

示例

计算每个学生每学年的必修课平均绩点,并找出每学期中绩点≥3.5的学生。

样本:GPA数据表

在计算GPA时只考虑必修课,因此需要使用 WHERE is_required = TRUE来排除选修课。需要计算每个学生每学年的平均绩点,因此需要用GROUP BY命令按student_id 和school_year 两列来进行分组,并取gpa的平均值。最后,只保留平均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之间有什么区别,或者想知道为什么不直接用avg_gpa>= 3.5,而是指定函数。下一节将会给出详细解释。

SQL查询语句执行顺序

在写SQL查询时,大多数人是按照自上而下的顺序,但他们可能并不知道SELECT是SQL引擎最后执行的函数之一。以下是SQL查询的执行顺序:

1. FROM, JOIN

2. WHERE

3. GROUP BY

4. HAVING

5. SELECT

6. DISTINCT

7. ORDER BY

8. LIMIT, OFFSET

回头再看前面的示例。因为需要在计算平均绩点之前过滤掉选修课,所以可以用 WHERE is_required = TRUE来代替HAVING,因为WHERE在GROUP BY和HAVING之前执行。不用HAVINGavg_gpa >= 3.5的原因是avg_gpa被定义为SELECT的一部分,所以不能在SELECT之前执行的步骤中引用。

图源:unsplash

笔者建议在编写查询时按照执行顺序编写,这在编写复杂查询时非常有用。

窗口函数

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

· RANK /DENSE_RANK /ROW_NUMBER:通过对特定列排序,为每行分配一个秩。如果给定了任何分区列,则行将在其所属的分区组中排列。

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

在SQL面试中,面试者必须知道排名函数之间的差异,以及何时使用LAG/LEAD。

示例

找出每个部门中薪资最高的3名职员。

样本:职员薪资表2

当SQL问题要求找出“前N名”时,可以使用ORDER BY或ranking函数来回答。但以上示例要求计算“每个Y中的前N 个X”,这代表着面试者应该使用排ranking函数,因为需要对每个分区组中的行进行排列。

下面的查询能准确找到3名薪资最高的职员,不考虑并列:

WITH TAS (
SELECT*,ROW_NUMBER() OVER (PARTITION BYdepartment_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 aunique rank number and ranks for tied records are assigned randomly. Forexmaple, Rimsha and Tiah may be rank 2 or 3 in different query runs.

另外,根据面试官对并列情况处理的要求,面试者也可选择不同的ranking函数。再次提醒大家,细节很重要!

ROW_NUMBER、RANK和 DENSE_RANK 三种函数的对比。

重复项

SQL面试中的另一个常见陷阱是忽略重复项。尽管有些列在示例数据中似乎具有不同的值,但面试者还是应该考虑所有可能的情况,就像在处理真实的数据集一样。例如,在上例的员工薪资表中,不同职员可能出现同名情况。

想要避免重复项引起的潜在问题,一个简单的方法是始终使用ID列来标识不同的记录,避免重复。

示例

根据职员薪资表,找出所有部门每个职员的总工资。

正确的解决方案是按employee_id 来分组,使用SUM(employee_salary)来计算总薪资。如果需要员工姓名,可在末尾加入职员表格来检索职员的姓名信息。

用employee_name来分组是错误的。

图源:unsplash

NULL

在SQL中,任何谓词都可能产生以下三个值之一:true、false和NULL。NULL这一关键词用于指代未知或空缺数据。处理NULL可能会非常棘手。在SQL面试中,面试官会特别注意面试者在解决过程中是否处理了NULL。在一些情况下,很明显某列数据不能为空值(例如ID列),但大多数其他的列很可能会出现NULL。

笔者建议面试者确认示例数据中的关键列是否可以为空值,如果可以,则可以使用IS (NOT) NULL、IFNULL和COALESCE 等函数来覆盖这些边缘情况。

(想进一步了解如何处理NULL吗?请参阅在SQL中处理空值的指南。https://towardsdatascience.com/demystify-null-values-in-sql-bc7e7e1b913a)

沟通

另外很重要的一点在于——在面试过程中保证流畅的沟通。

在笔者面试过的求职者中的很多人,除非真的有问题,否则几乎不说话。如果他们能在最后给出完美的解决方案,那倒也没什么大问题,但在技术面试中保持与面试者的沟通通常会有所助益。例如,面试者可以谈论自己对问题和数据的理解、自己是如何计划解决问题的、使用这个函数而不是另外一个的原因、或者正在考虑的边缘情况。

图源:unsplash

总结

· 先提问,收集所需的详细信息。

· 谨慎选择连接方式——自然连接,左连接还是全连接。

· 使用GROUP BY聚合数据,合理使用WHERE和HAVING。

· 了解三个ranking函数之间的差异。

· 了解何时使用LAG/LEAD窗口功能。

· 如果需要创建的查询太过复杂,尝试按照SQL执行顺序编写。

· 考虑潜在的数据问题,如重复项和空值。

· 与面试官沟通思维过程。

面试顺利冲鸭!

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

如何拿下SQL面试?这些技巧和陷阱必须要知道……相关推荐

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

    作者 | Xinran Waibel 译者 | 天道酬勤 责编 | 徐威龙 封图| CSDN 下载于视觉中国 SQL是用于数据分析和数据处理的最重要的编程语言之一,因此SQL问题始终是与数据科学相关工 ...

  2. 超全超详细,常见SQL 面试知识点汇总

    SQL是用于数据分析和数据处理的最重要的编程语言之一, 因此与数据科学相关的工作(例如数据分析师.数据科学家和数据工程师)在面试时总会问到关于 SQL 的问题. SQL面试问题旨在评估应聘者的技术和解 ...

  3. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)...

    本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...

  4. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧

    转载自  面试了 N 个候选人后,我总结出这份 Java 面试准备技巧 目录: 框架是重点,但别让人感觉你只会山寨别人的代码 别只看单机版的框架,分布式也需要了解 对于数据库,别只知道增删改查,得了解 ...

  5. 程序员 sql面试_非程序员SQL使用指南

    程序员 sql面试 Today, the word of the moment is DATA, this little combination of 4 letters is transformin ...

  6. IT必须掌握的面试大全技巧教你怎么回答

    最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.尽管面试公司不同,面试方式也不同,但是万变不离其宗,只要掌握了面试的技巧,了解面试官的出题 ...

  7. 转:大数据面试之_01_IT 从业人员面试小技巧

    IT从业人员面试小技巧   一般来说,面试你的人都不是一个很好对付的人.别看他彬彬有礼,看上去笑眯眯的,很和气的样子.但没准儿一肚子坏水.   有些人待人特别客气,说话还稍稍有点结巴的,更容易让人上当 ...

  8. 【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  9. 【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. how to extend odata service
  2. 《数学建模:基于R》——1.1 数据的描述性分析
  3. java锁的膨胀过程和优化
  4. cocoapods 更新指定的第三方库
  5. 常见字符编码详解ANSI,UTF-8,UCS,GBK,GB2312,BIG5
  6. 学习Java,你能做这些工作:
  7. Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)
  8. P2345 [USACO04OPEN]MooFest G 【树状数组】
  9. 如何查看你的浏览器的Flash版本
  10. matlab混频器的实现
  11. java 文件下载示例_文件下载示例代码(JAVA)
  12. cmd命令行窗口调整大小
  13. AI人工智能可以做哪些课题的毕业设计毕设
  14. 小技巧---笔记本外接显示器设置全屏壁纸
  15. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
  16. burp如何设置微信小程序代理
  17. 传统教培机构搭建网校平台是否成必然的趋势?
  18. python从键盘输入列表有缺陷_程序员必知的Python陷阱与缺陷列表-阿里云开发者社区...
  19. 三星 9810 android 9,三星S9双版本对比:骁龙845碾压Exynos 9810
  20. (剪花布条、客似云来)笔试强训

热门文章

  1. JavaScript实现冒泡排序 可视化 1
  2. linux zip不保留源文件,Linux_gzip和gunzip 解压参数,Linux压缩保留源文件的方法: g - phpStudy...
  3. 【小郝推荐】《从实例走进OPhone世界》
  4. 电子计算机可以报考药师吗,具备什么条件,才可以报考执业西药师?
  5. mysql中的mvcc机制
  6. 走廊泼水节(最小生成树求最小完全图)
  7. h+ admin ui框架
  8. 互联网“红包大战”套路深
  9. 【JAVADAY35】thymeleaf技术的初步使用及基本语法
  10. 聚首银川 探索互联网远行之路