02.28 数据科学家常见的五个 SQL 面试问题

数据科学家常见的五个 SQL 面试问题

数据科学家常见的五个 SQL 面试问题

作者 | Alexei Ledenev

翻译 | 天道酬勤,责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键,尽管这不是工作中最有趣的部分。事实上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,还有更多的SQL方法。你知道的功能越多,操作和查询所需的内容就越容易。

作者希望在本文中学习和交流以下两件事:

1)学习和教一些基本功能以外的SQL函数;2)探讨一些SQL面试练习问题。

* 本文中的问题仅来自Leetcode

数据科学家常见的五个 SQL 面试问题

问题1:第二高的薪水

编写一个SQL查询用于从Employee表中获取第二高的薪水。例如,给定下面的Employee表,查询应返回200作为第二高的薪水。如果没有第二高的薪水,则查询应返回。

<code>+----+--------+/<code><code>| Id | Salary |/<code><code>+----+--------+/<code><code>| 1 | 100 |/<code><code>| 2 | 200 |/<code><code>| 3 | 300 |/<code><code>+----+--------+/<code>

1)解决方案A使用IFOFFSET

  • IF(表达,alt):如果为,则if返回指定的值,否则返回期望的值。 如果没有第二高的薪水,我们会使用它返回。

  • OFFSET:offset与ORDERBY子句一起使用可忽略指定的前n行。这会很有用,因为你希望获得第二行(第二高的薪水)

<code>| Id | Salary |/<code><code>+----+--------+/<code><code>| 1 | 100 |/<code><code>| 2 | 200 |/<code><code>| 3 | 300 |/<code><code>+----+--------+/<code>

2)解决方案B使用MAX

此查询表示选择的MAX薪水不等于最高薪水,这等于选择第二高的薪水。

<code>SELECT/<code><code>IF(/<code><code>(SELECT DISTINCT Salary/<code><code>FROM Employee/<code><code>ORDER BY Salary DESC/<code><code>LIMIT 1 OFFSET 1/<code><code>), ) as SecondHighestSalary/<code><code>FROM Employee/<code><code>LIMIT 1/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

问题2:重复的电子邮件

编写SQL查询以在名为Person的表中查找所有重复的电子邮件。

<code>+----+---------+/<code><code>| Id | Email |/<code><code>+----+---------+/<code><code>| 1 | [email protected] |/<code><code>| 2 | [email protected] |/<code><code>| 3 | [email protected] |/<code><code>+----+---------+/<code>

1)解决方案A子查询中的

COUNT

首先,创建一个子查询来显示每封电子邮件的频率次数。然后子查询在计数大于1的地方被过滤。

<code>SELECT Email/<code><code>FROM (/<code><code>SELECT Email, count(Email) AS count/<code><code>FROM Person/<code><code>GROUP BY Email/<code><code>) as email_count/<code><code>WHERE count > 1/<code>

2)解决方案B:HAVING子句

  • HAVING是一个子句,从本质上讲,你可以将WHERE语句与聚合(GROUP BY)结合使用。

<code>SELECT Email/<code><code>FROM Person/<code><code>GROUP BY Email/<code><code>HAVING count(Email) > 1/<code>
数据科学家常见的五个 SQL 面试问题

问题3:温度上升

下面给定一个天气表,编写一个SQL查询来查找与其之前(昨天)日期相比温度更高的所有日期的ID。

<code>+---------+------------------+------------------+/<code><code>| Id(INT) | RecordDate(DATE) | Temperature(INT) |/<code><code>+---------+------------------+------------------+/<code><code>| 1 | 2015-01-01 | 10 |/<code><code>| 2 | 2015-01-02 | 25 |/<code><code>| 3 | 2015-01-03 | 20 |/<code><code>| 4 | 2015-01-04 | 30 |/<code><code>+---------+------------------+------------------+/<code>

解决方案:DATEDIFF

  • DATEDIFF是计算两个日期之间的差,用于确保我们将今天的温度与昨天的温度进行比较。

简单来说,查询是选择给定日期的温度高于昨天的温度的ID。

<code>SELECT DISTINCT a.Id/<code><code>FROM Weather a, Weather b/<code><code>WHERE a.Temperature > b.Temperature/<code><code>AND DATEDIFF(a.Recorddate, b.Recorddate) = 1/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

问题4:部门最高薪资

下面的雇员表中包含所有雇员。每个员工都有一个ID、一个薪水,还有一个部门ID列。

<code>+----+-------+--------+--------------+/<code><code>| Id | Name | Salary | DepartmentId |/<code><code>+----+-------+--------+--------------+/<code><code>| 1 | Joe | 70000 | 1 |/<code><code>| 2 | Jim | 90000 | 1 |/<code><code>| 3 | Henry | 80000 | 2 |/<code><code>| 4 | Sam | 60000 | 2 |/<code><code>| 5 | Max | 90000 | 1 |/<code><code>+----+-------+--------+--------------+/<code>

下面的部门表包含公司的所有部门。

<code>+----+----------+/<code><code>| Id | Name |/<code><code>+----+----------+/<code><code>| 1 | IT |/<code><code>| 2 | Sales |/<code><code>+----+----------+/<code>

编写SQL查询来查找每个部门中薪水最高的员工。对于上述两个表,你的SQL查询应返回以下行(行的顺序无关紧要)。

<code>+------------+----------+--------+/<code><code>| Department | Employee | Salary |/<code><code>+------------+----------+--------+/<code><code>| IT | Max | 90000 |/<code><code>| IT | Jim |90000 |/<code><code>| Sales | Henry | 80000 |/<code><code>+------------+----------+--------+/<code>

解决方案:IN子句

  • IN子句允许你在WHERE语句中使用多个OR子句。例如,WHERE country ='Canada'或country ='USA'与WHERE country IN('Canada','USA')相同。

  • 在这种情况下,我们希望过滤部门表来仅显示每个部门的最高薪水(即DepartmentId)。然后,我们可以将两个表连接在一起,其中DepartmentId和Salary在已过滤的Department表中。

<code>SELECT/<code><code>Department.name AS 'Department',/<code><code>Employee.name AS 'Employee',/<code><code>Salary/<code><code>FROM Employee/<code><code>INNER JOIN Department ON Employee.DepartmentId = Department.Id/<code><code>WHERE (DepartmentId , Salary)/<code><code>IN/<code><code>( SELECT/<code><code>DepartmentId, MAX(Salary)/<code><code>FROM/<code><code>Employee/<code><code>GROUP BY DepartmentId/<code><code>)/<code>
数据科学家常见的五个 SQL 面试问题
数据科学家常见的五个 SQL 面试问题

问题5:互换座位

玛丽是一所中学的老师,她有一张座位表,上面存储着学生的姓名和相应的座位ID。列ID是连续的增量,玛丽想为相邻的学生互换座位。

你可以编写SQL查询来输出玛丽的结果吗?

<code>+---------+---------+/<code><code>| id | student |/<code><code>+---------+---------+/<code><code>| 1 | Abbot |/<code><code>| 2 | Doris |/<code><code>| 3 | Emerson |/<code><code>| 4 | Green |/<code><code>| 5 | Jeames |/<code><code>+---------+---------+/<code>

对于样本输入,输出为:

<code>+---------+---------+/<code><code>| id | student |/<code><code>+---------+---------+/<code><code>| 1 | Doris |/<code><code>| 2 | Abbot |/<code><code>| 3 | Green |/<code><code>| 4 | Emerson |/<code><code>| 5 | Jeames |/<code><code>+---------+---------+/<code> 

注意:如果学生人数为奇数,则无需更改最后一个座位。

解决方案:CASE WHEN

  • 可以将CASE WHEN THEN语句视为编码中的IF语句。

  • 第一条WHEN语句检查行数是否为奇数,如果行数为奇数,请确保ID号不变。

  • 第二个WHEN语句为每个id加1(例如,1,3,5变为2,4,6)

  • 同样,第三个WHEN语句将每个id减1(2,4,6变为1,3,5)

<code>SELECT/<code><code>CASE/<code><code>WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENid/<code><code>WHEN id%2 = 1 THEN id + 1/<code><code>ELSE id - 1/<code><code>END AS id, student/<code><code>FROM seat/<code><code>ORDER BY id/<code>

以上就是所有的解决方法,如果有不清楚的地方或其他意见,欢迎评论告诉我们!


分享到:


相關文章: