SQL面试问题。数据分析师的3个技术筛选练习(2022年)

175 阅读14分钟

我参加过许多工作面试--在桌子的两边。在这个过程中,最有趣,但也是最令人恐惧的部分是技术筛选。在这篇文章中,我将向你展示三个SQL测试练习,根据我的经验,这些练习在数据分析师工作面试中非常典型--截至2022年。(嘿,这些是SQL面试问题的 "样本",但它们在很大程度上是基于现实的!)

在任务之前--你可以在SQL技术筛选中期待什么?

有两种常见的SQL技术筛选的方式。

sql interview questions tech screening

比较简单但不太常见的方式是,你有一台电脑、一个数据集和一个任务。当你解决这个任务时,面试官在听并提出问题。只要你能在合理的时间内想出正确的解决方案,稍微试错一下是完全可以的。

另一种更困难(但也更常见)的方式是**白板面试。**在这种情况下,你不会得到一台电脑。你必须解决任务,并在白板上勾画出代码。这意味着你不会得到反馈(至少不会从电脑上得到)你的代码中是否有逻辑或语法错误。当然,你仍然可以通过反复思考来解决这些任务。你可以逐一破解不同的SQL问题......但你必须对自己的SQL技能非常自信。

此外,通常情况下,你必须临时解决这些任务。也许你会有3-5分钟的思考时间,但这是你能期待的最大限度。

我知道,这听起来很有压力。而且确实如此。但不要担心,也有一些好消息。因为公司知道这是一个高压力的面试类型,与现实生活中的挑战相比,你将得到相对简单的任务。(请看下面的难度等级!)

2022年的SQL技术评估

有几种类型的SQL技术评估。我上面描述的那种(为此,我将在下面提供一些练习)是最常见的一种。当人们说*"SQL技术筛选 "时,他们通常指的是这个。更准确地说,我喜欢叫它"当面的SQL筛选"。*

但是,事实上,有四种不同类型的SQL评估。

  1. 当面的SQL筛选。我们到目前为止所讨论的那个(并将在文章的其余部分讨论)。
  2. SQL问答题。例如:*"什么是主键?"或者"列出不同类型的JOINs!"*这是一种愚蠢的SQL技术评估 - 因为它侧重于理论而不是实践。不过,有些公司......你知道的。
  3. 带回家的SQL任务。你得到一个更复杂的任务,你必须写多个SQL查询来解决它。好处是可以在家工作,因为你通过电子邮件得到任务和数据集。你在你选择的工作日得到这些,你将有~12个小时来解决它,并将解决方案发回(SQL查询和一个简短的演示)。我喜欢这种评估类型,因为它为申请人创造了一个不太紧张的环境。
  4. 自动SQL筛选。随着远程工作的兴起,自动SQL筛选变得越来越普遍。这通常是一个一小时的过程,有几个比较简单的SQL任务--你可以在家里通过浏览器解决。这种面试类型不是很个人化,但我喜欢它,因为它压力小,而且更灵活(例如,你可以跳过任务,以后再去做)。

当有人要求你做*"SQL技术筛选 "时,以上两种都可能出现。*不过,最常见的还是亲临现场的SQL筛选。因此,让我们看看这方面的几个例子吧!

测试一下自己!

这里有三个SQL面试问题,与我在数据分析师/科学家工作面试中实际得到或给出的问题非常接近!

尝试解决所有这些问题,就像白板面试一样!

在文章的后半部分,我也会向你展示解决方案!

/*! elementor - v3.6.5 - 27-04-2022 */ .elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-head .elementor-heading-title[class*=elementor-size-]>a{color:herit;font-size:herit;line-height:herit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading.elementor-heading-title.elementor-size-xxl{font-size:59px}

如何成为一名数据科学家

(Tomi Mester的50分钟免费视频课程)

/*! elementor - v3.6.5 - 27-04-2022 */ .elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#818a91;color:#fff}.elementor-widget-text-editor。elementor-drop-cap-view-framed .elementor-drop-cap{color:#818a91;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) 。elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor.elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}。

只需在这里订阅Data36新闻通讯(免费)!

/*! elementor-pro - v3.7.1 - 16-05-2022 */ .elementor-button.elementor-hidden,.elementor-hidden{display:none}.e-form__step{width:100%}.e-form__step:not( .elementor-hidden){显示:-webkit-box;显示:-ms-flexbox;显示:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.e-form__buttons{-ms-flex-wrap:wrap;flex-wrap:wrap}.e-form__buttons,.e-form__buttons__wrapper{显示:-webkit-box;显示:-ms-flexbox;显示:flex}.e-form__indicators{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:13px;margin-bottom:var(-e-form-steps-indicators-spacing)}.e-form__indicators,.e-form__indicators__indicator{显示:-webkit-box;显示:-ms-flexbox;显示:flex;-webkit-box-align:center;-ms-flex-align:center;对齐-项目:center}.e-form__indicators__indicator{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-preferred-size:0;flex-base:0; padding:0 var(-e-form-steps-divider-gap) }.e-form__indicators__indicator__progress{width:100%;position:relative;background-color:var(--e-form-steps-indicator-progress-background-color); border-radius:var(--e-form-steps-indicator-progress-border-radius); overflow:hidden}.e-form__indicators__indicator__progress__meter{width:var(--e-form-steps-indicator-progress-meter-width,0);height:var(--e-form-steps-indicator-progress-height);line-height:var(-e-form-steps-indicator-progress-height);padding-right:15px;border-radius:var(--e-form-steps-indicator-progress-border-radius);background-color:var(--e-form-steps-indicator-progress-color);color:var(-e-form-steps-indicator-progress-meter-color);text-align:right;-webkit-transition:width .1s linear;-o-transition:width .1s linear;transition:width .1s linear}.e-form__indicators__indicator:first-child{padding-left:0}.e-form__indicators__indicator:last-child{padding-right:0}。e-form__indicators__indicator--state-inactive{color:var(-e-form-steps-indicator-inactive-primary-color,#c2cbd2)}.e-form__indicators__indicator--state-inactive [class*=indicator--shape-] :not(.e-form__indicators__indicator--shape--none){background-color:var(-e-form-steps-indicator--active-secondary-color,#fff)}.e-form__indicators__indicator--state-active object, .e-form__indicators__indicator--state-active svg{fill:var(-e-form-steps-indicator--active-primary-color,#c2cbd2)}。e-form__indicators__indicator--state-active{color:var(--e-form-steps-indicator-active-primary-color,#39b54a); border-color:var(--e-form-steps-indicator-active-secondary-color,#fff)}.e-form__indicators__indicator--state-active [class*=indicator--shape]:not(.e-form__indicators__indicator--shape-none){background-color:var(--form-steps-indicator-active-secondary-color,#fff)}.e-form__indicators__indicator--state-active object,.e-form__indicators__indicator--state-active svg{fill:var(-e-form-steps-indicator-active-primary-color,#39b54a)}.e-form__indicators__indicator--state-completed{color:var(-e-form-step-indicator-completed-secondary-color,#fff)}.e-form__indicators__indicator--state-completed [class*=indicator--shape-]:not(.e-form__indicators__indicator--shape--none){background-color:var(--e-form-step-indicator--completed-primary-color,#39b54a)}.e-form__indicators__indicator--state-completed .e-form__indicators__indicator__label{color:var(--e-form-step-indicator-completed-primary-color,#39b54a)}.e-form__indicators__indicator--state-completed .e-form__indicators__indicator--shape-none{color:var(-e-form-steps-indicator-completed-primary-color,#39b54a); background-color:initial}.e-form__indicators__indicator--state-completed object,.e-form__indicators__indicator--state-completed svg{fill:var(-e-form-steps-indicator-completed-secondary-color,#fff)}.e-form__indicators__indicator__icon{width:var(--e-form-steps-indicator-padding,30px);height:var(--e-form-steps-indicator-padding,30px);font-size:var(-e-form-steps-indicator-size);border-width:1px;border-style:solid;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align;-ms-flex-align;align-items:center;overflow:hidden;margin-bottom:10px}.e-form__indicators__indicator__icon img,.e-form__indicators__indicator__icon object,.e-form__indicators__indicator__icon svg{width:var(-e-form-steps-indicator-icon-size);height:auto}.e-form__indicators__indicator__icon .e-font-icon-svg{height:1em}。e-form__indicators__indicator__number{width:var(--e-form-steps-indicator-padding,30px);height:var(--e-form-steps-indicator-padding,30px); border-width:1px; border-style:solid; display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align;-ms-flex-align;align-items:center;margin-bottom:10px}.e-form__indicators__indicator--shape-circle{border-radius:50%}.e-form__indicators__indicator--shape-square{border-radius:0}.e-form__indicators__indicator--shape-rounded{border-radius:5px}.e-form__indicators__indicator--shape-none{border:0}。e-form__indicators__indicator__label{text-align:center}.e-form__indicators__indicator__separator{width:100%;height:var(-e-form-steps-divider-width);background-color:#c2cbd2}.e-form__indicators--type-icon, .e-form__indicators--type-icon_text, .e-form__indicators--type-number, .e-form__indicators--type-number_text{-webkit-box-align:start;-ms-flex-align:start; align-items:flex-start}.e-form__indicators--type-icon .e-form__indicators--type-icon .e-form__indicators__indicator__separator,.e-form__indicators--type-number .e-form__indicators__indicator__separator,.e-form__indicators--type-number_text .e-form__indicators__indicator__separator{margin-top:calc(var(--e-form-steps-indicator-padding, 30px) / 2 - var(--e-form-steps-divider-width, 1px) / 2)}。elementor-field-type-html{display:inline-block}.elementor-login .elementor-lost-password, .elementor-login .elementor-remember-me{font-size:.85em}.elementor-field-type-recaptcha_v3 .elementor-field-label{display:none}.elementor-field-type-recaptcha_v3 .grecaptcha-badge{z-index:1}.elementor-button .elementor-form-spinner{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.elementor-form .elementor-button>span{显示:-webkit-box;显示:-ms-flexbox;显示:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align;align-items:center}.elementor-form.elementor-button .elementor-button-text{white-space:normal;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.elementor-form .elementor-button svg{height:auto}.elementor-form .e-fon-icon-svg{height:1em}。

我接受Data36的隐私政策。(没有垃圾邮件。只有有用的数据科学相关内容。当你订阅后,我将每周给你发几封邮件,让你了解最新的信息。你会得到文章、课程、小抄、教程和许多很酷的东西)。

现在就进入!

SQL面试问题#1

假设你有两个SQL表:authorsbooks
authors 数据集有100多万行。下面是一个小样本,前六行。

author_name书名
作者_1book_1
作者_1书名_2
作者_2书籍_3
作者_2书籍_4
作者_2书籍_5
作者_3book_6
......

books 数据集也有100多万行,这里是前六行。

book_name已售数量
book_11000
book_21500
书籍334000
书籍_429000
书籍_540000
book_64400
......

创建一个SQL查询,显示总销量最高的3位作者

(注:当年我在一家非常知名的瑞典IT公司担任数据科学家职位时,几乎收到了一模一样的SQL面试题。)

SQL面试问题#2

你在一家制作在线演示软件的创业公司工作。你有一个事件日志,记录用户每次在演示文稿中插入图片的情况。(一个用户可以插入多个图片。)event_log SQL表看起来像这样。

user_id事件_日期_时间
74942121535308430
74942121535308433
14751851535308444
69467251535308475
69467251535308476
69467251535308477
......

...而且它有超过10亿行。

注意:如果event_date_time 列的格式看起来不熟悉,请谷歌一下 "纪元时间戳"!

编写一个SQL查询,找出有多少用户在他们的演示文稿中插入了超过1000张但少于2000张的图片!

(注:当我还是自由职业者,而我的客户在招聘过程中需要帮助时,我亲自创造并使用了这个面试问题来测试数据分析员。)

SQL面试题#3

你有两个SQL表!

第一个表叫employees ,它包含了一个公司的雇员姓名、唯一的雇员ID和部门名称。样本。

department_nameemployee_id雇员_姓名
销售额123约翰-多伊
销售部211简-史密斯
人力资源556比利-鲍勃
销售711罗伯特-哈耶克
市场营销235爱德华-乔格森
市场营销236克里斯蒂娜-帕卡德
.........

第二个SQL表被称为salaries 。它保存了相同的雇员姓名和相同的雇员ID - 以及每个雇员的工资。样本。

薪水employee_idemployee_name
500123约翰-多伊
600211简-史密斯
1000556比利-鲍勃
400711罗伯特-哈耶克
1200235Edward Jorgson
200236克里斯蒂娜-帕卡德
.........

该公司有546名员工,所以两个表都有546行。

打印每个员工的平均工资低于500美元的部门!

(注:我是根据我从一个朋友那里听到的一个真实的SQL面试问题创建这个测试题的,他申请的是一家最大的社交媒体公司(名字以'F'开头;))

SQL面试题#1的解决方案

解决方案的代码是。

SELECT authors.author_name, SUM(books.sold_copies) AS sold_sum
FROM authors
JOIN books
ON books.book_name = authors.book_name
GROUP BY authors.author_name
ORDER BY sold_sum DESC
LIMIT 3;

下面是一个简短的解释。

1.首先,你必须启动JOIN 。我通过使用连接两个表。

SELECT *
FROM authors
JOIN books
ON books.book_name = authors.book_name;

2.之后,我使用了一个带有GROUP BY 子句的SUM() 函数。这意味着在SELECT 语句中,我必须用author_namesold_copies 列替换* 。(并不是一定要指明你从哪个表中选择列,但这是值得的。这就是为什么我使用 **authors**.author_name**books**.sold_copies.)

3.最终,我将结果按DESC结尾的顺序进行了ORDER。(为了方便,我还在SELECT 语句中使用AS sold_sum 方法将sum 列重命名为sold_sum )。

SQL面试问题#2的解决方案

SQL查询的解决方案是。

SELECT COUNT(*) FROM
  (SELECT user_id, COUNT(event_date_time) AS image_per_user
  FROM event_log
  GROUP BY user_id) AS image_per_user
WHERE image_per_user < 2000 AND image_per_user > 1000;

这个任务的诀窍是,你必须使用COUNT() 函数两次:首先,你必须计算每个用户的图片数量,然后计算(满足给定条件的)用户数量。最简单的方法是使用子查询。

  1. 先写好内部查询!在event_log 表上运行一个带有GROUP BY 子句的简单COUNT() 函数。
  2. 确保你为子查询创建一个别名(AS image_per_user)。这是SQL中的一个语法要求。
  3. 最后,在一个外层查询中,对子查询的结果应用一个WHERE 过滤器和一个COUNT() 函数。

SQL面试问题#3的解决方案

解决方案。

SELECT department_name, AVG(salaries.salary) AS avg_salaries
FROM employees
JOIN salaries
ON employees.employee_id = salaries.employee_id
GROUP BY department_name
HAVING AVG(salaries.salary) < 500;

注意:你也可以用子查询来解决这个任务--但在面试情况下,面试官会更喜欢上面的解决方案。

简单解释一下。

1.首先将两个表连接起来。

SELECT *
FROM employees
JOIN salaries
ON employees.employee_id = salaries.employee_id

注意!使用employee_id ,而不是employee_name 。(你可以在一家公司有两个John Does,但雇员ID是唯一的!)。

2.然后使用带有GROUP BY 子句的AVG() 函数 - 用适当的列替换* 。(就像在第一个任务中一样。)

3.最后一步是使用HAVING 子句,通过AVG() 函数的结果来过滤。(记住:WHERE 在这里不好,因为它将在AVG() 函数之前启动。
)注意:在HAVING 行中,你不能引用别名--你必须再次使用整个函数本身!

通过练习为SQL技术筛选做准备!

如果你正确解决了所有这些问题,你可能已经准备好参加初级甚至中级数据分析师的SQL技术筛选。

如果没有,让我推荐我的新的在线课程。有抱负的数据科学家的SQL(7天在线课程)--在这里你可以在短短7天内提高(或刷新)你的SQL技能。当你完成课程后,只要回到这篇文章,我保证你将能够解决这些问题

如果你刚要开始学习SQL,就从我在博客上的SQL For Data Analysis系列开始吧!

而最终,如果你觉得自己已经为初级数据科学家的职位做好了准备,但你想在申请工作之前尝试一下它是如何运作的,可以参加我为期6周的数据科学课程。

初级数据科学家的第一个月

一个100%实用的在线课程。一个为期6周的模拟在一个真实的创业公司担任初级数据科学家的课程。

"解决真正的问题,获得真正的经验--就像在一个真正的数据科学工作中一样"。

了解更多...

总结

这些SQL面试问题的难点在于它们是抽象的。任务说要 "想象一下数据集",并且只显示其中的几行。当你得到这样的练习时,如果你以前看到过类似的数据集和解决过类似的问题,那就会有很大的帮助。我希望解决本文中的任务能够增强你的信心

如果你有问题或替代的解决方案,不要犹豫,通过电子邮件发送,我将为你审核

干杯。
托米-梅斯特

The postSQL Interview Questions:数据分析师的3个技术筛选练习(2022年)首次出现在Data36上。