数据库常见面试题-vue.js常见面试题
点击上方“SQL数据库开发”关注,
设置为“Top or Star”,干货第一时间送达
SQL 是用于数据分析和数据操作的最重要的编程语言之一,因此与数据科学相关的工作,如数据分析师、数据科学家和数据工程师,在面试时总是会问到有关 SQL 的问题。
SQL 面试问题旨在评估候选人的技术和解决问题的能力。 所以对于考生来说,关键不仅是要根据样本数据编写正确的查询,还要像真实世界的数据集一样考虑各种场景和边缘情况。
在本文中,我将描述 SQL 面试问题中的常见模式,并提供一些在 SQL 查询中巧妙处理这些问题的技巧。
1个
问问题
在 SQL 面试中要做好的最重要的事情是尽可能多地提问,以获得有关给定任务和数据样本的所有详细信息。 充分了解需求后,您可以节省大量迭代问题的时间并很好地处理边缘情况。
我注意到许多候选人经常在没有完全理解 SQL 问题或数据集的情况下开始编写解决方案。 然后,在我指出他们的解决方案存在问题后数据库常见面试题,他们不得不反复修改查询。 最后,他们浪费了大量的面试时间在迭代上,甚至到最后可能都找不到合适的解决方案。
我建议大家在参加SQL面试的时候,就好像是在和一个商业伙伴一起工作。 所以在你提供解决方案之前,你应该了解数据请求的所有要求。
例子:
找到工资最高的前 3 名员工。
示例 employee_salary 表
这里要请面试官明确“前三名”具体是什么意思。 我应该在结果中包括 3 名员工吗? 你希望我如何处理这段关系? 此外,仔细检查示例员工数据。 salary 字段的数据类型是什么? 计算前需要清空数据吗?
2个
选择哪个JOIN
在 SQL 中,JOIN 通常用于合并来自多个表的信息。
有四种不同类型的 JOIN,但在大多数情况下我们只使用 INNER、LEFT 和 FULLJOIN,因为 RIGHTJOIN 不是很直观并且可以使用 LEFTJOIN 轻松重写。 在 SQL 面试中,您需要根据给定问题的具体要求选择要使用的正确 JOIN。
例子:
找出每个学生选修的课程总数。 (提供学号、姓名和修读的课程数。)
样本学生和班级历史表
您可能已经注意到,并不是所有出现在 class_history 表中的学生都出现在 student 表中,可能是因为这些学生已经毕业了。 (这实际上在事务数据库中非常典型,因为不再活动的记录往往会被删除。)
根据面试官是否希望将毕业生包括在结果中,我们需要使用 LEFT JOIN 或 INNER JOIN 来合并两个表:
WITH class_count AS (
SELECT student_id, COUNT(*) AS num_of_class
FROM class_history
GROUP BY student_id
)
SELECT
c.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
3个
通过...分组
GROUP BY 是 SQL 中最重要的函数,因为它被广泛用于数据聚合。 如果您在 SQL 问题中看到诸如 sum、average、minimum 或 maximum 之类的关键字,这很好地表明您应该在查询中使用 GROUP BY。
一个常见的陷阱是在 GROUP BY 过滤数据时混淆 WHERE 和 HAVING - 我见过很多人犯过这个错误。
例子:
计算每个学生每学年必修课的平均GPA,找出每学期符合Dean's List(GPA≥3.5)资格的学生。
示例 gpa_history 表
由于我们在计算 GPA 时只考虑必修课,所以我们需要使用 WHERE is_required=TRUE 来排除选修课。
我们需要每个学生每个学年的平均 GPA,因此我们将 GROUP BY student_id 和 school_year 列并取 gpa 列的平均值。 最后,我们只保留学生平均 GPA 高于 3.5 的行,这可以使用 HAVING 来实现。 合起来是这样的:
SELECT
student_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 时,只能选择 group-by 列和聚合列,因为其他列中的行级信息将被丢弃。
4个
SQL查询执行顺序
大多数人会从 SELECT 开始,然后从上到下编写 SQL 查询。
但是你知道吗,SELECT 是在 SQL 引擎执行函数之后才执行的? 以下是 SQL 查询的执行顺序:
再次考虑前面的例子:
由于我们要在计算平均 GPA 之前过滤掉选修课,所以我使用 WHERE is_required=TRUE 而不是 HAVING,因为 WHERE 会在 GROUP BY 和 HAVING 之前执行。 我不能写 HAVING avg_gpa >= 3.5 的原因是 avg_gpa 被定义为 SELECT 的一部分,因此在 SELECT 之前执行的步骤中不能引用它。
我建议在编写查询时遵循引擎的执行顺序,这在编写复杂查询时很有用。
5个
窗函数
窗口函数在 SQL 面试中也经常出现。 常见的窗口函数有五个:
在 SQL 面试中,了解排名函数之间的区别以及知道何时使用 LAG/LEAD 非常重要。
例子:
找出每个部门中收入最高的前 3 名员工。
另一个例子 employee_salary 表
当 SQL 问题要求计算“TOP N”时,我们可以使用 ORDER BY 或排名函数来回答问题。
但在此示例中,它要求计算“每个 Y 中的 TOP NX”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。
下面的查询准确地找到了 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 结果对比
6个
重复
SQL 面试中的另一个常见陷阱是忽略数据重复。
尽管样本数据中的某些列似乎具有不同的值数据库常见面试题,但面试官希望候选人像处理真实数据集一样考虑所有可能性。
例如:
在前面的示例 employee_salary 表中,可以让员工共享相同的名称。
避免由重复引起的潜在问题的一种简单方法是始终使用 ID 列来唯一标识不同的记录。
例子:
使用 employee_salary 表查找每个部门所有员工的总工资。
正确的解决办法是GROUP BY employee_id,然后用SUM(employee_salary)计算总工资。 如果需要员工姓名,最后join员工表,获取员工姓名信息。
错误的方法是使用 GROUP BY employee_name。
7
无效的
在 SQL 中,任何谓词都可以产生 true、false 和 NULL 三个值之一,后者是未知或缺失数据值的保留关键字。 在处理 NULL 数据集时,它可能会出乎意料地棘手。
在 SQL 面试中,面试官可能会特别注意解决方案是否处理 NULL 值。 有时,一个列显然不能为 nullable,但对于大多数其他列,很可能会有 NULL 值。
建议:确认样本数据中的关键列是否可为空,
如果可以,利用 IS(NOT)NULL、IFNULL 和 COALESCE 等函数来涵盖这些边缘情况。
8个
交流
最后一点也很重要:在SQL面试的时候随时和面试官沟通。
我面试过的许多应聘者都很沉默寡言,只有在有疑问时才会说出来。 当然,如果他们最终找到了完美的解决方案,那也很好。
但是,在技术面试期间保持对话的进行通常很有价值。
例如:你可以谈谈你对问题和数据的理解,解释你打算如何解决这个问题,为什么你使用某些功能而不是其他选项,以及正在考虑哪些极端情况。
9
总结
欣然怀贝尔| 作者
王强 | 翻译器
我是岳哥,最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。
有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
数据前线 ——End——
后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群。
推荐阅读