跳至内容
数据分析
SQL

20 道顶级 SQL 联接面试题

用这份最常见的 SQL 联接问题清单为您的 SQL 面试做准备
Javier Canales Luna's photo
Javier Canales Luna
已更新 · 15分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

SQL(结构化查询语言)是一种强大的工具,可在海量数据中进行检索并返回用于分析的特定信息。学习 SQL 对立志成为数据分析师、数据工程师或数据科学家的任何人都至关重要,同时也对诸如网页开发或市场营销等诸多领域大有裨益。

无论您是在求职、希望寻找机会施展 SQL 技能,还是作为招聘经理准备面试候选人,面试中几乎必不可少的一个话题就是与 SQL 联接相关的问题。

在 SQL 中,联接(join)是一种用于合并并检索来自两个或多个表的记录的语句。SQL 表可以基于这些表中列之间的关系进行联接。

本文整理了最常被问到的 SQL 联接问题。练习这些面试题将帮助您备考,并在被问及这一热门概念时更有把握。

准备好测验了吗?让我们“联接”起来!

要点速览:SQL 联接面试精华

  • SQL 联接有六种核心类型:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN、SELF JOIN 和 CROSS JOIN。
  • INNER JOIN 只返回匹配的行,而 LEFT JOIN 与 RIGHT JOIN 会包含一侧表的所有行以及另一侧表中的匹配行。
  • 进阶面试话题包括半联接(semi-join)、反联接(anti-join),以及联接中 ON 与 WHERE 子句的区别。
  • 练习手写联接查询——面试官更看重您的解题思路,而非对语法的死记硬背。
  • 理解何时使用每种联接以及它们对性能的影响,尤其是会生成笛卡尔积的 CROSS JOIN。

10 道 SQL 联接入门面试题

1. 什么是联接?

联接是一种 SQL 子句,用于合并并检索来自两个或多个表的记录。SQL 表可以基于这些表中列之间的关系进行联接。查阅我们的 SQL 联接 教程了解全部细节。

2. 联接的主要类型有哪些?

联接主要有六种类型:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN
  • SELF JOIN
  • CROSS JOIN

3. LEFT JOIN 与 RIGHT JOIN 有何区别?

LEFT JOIN 返回左表的所有记录以及右表中与之匹配的记录。对于左表中在右表无匹配的行,结果中右表对应列会为 NULL。

RIGHT JOIN 返回右表的所有记录以及左表中与之匹配的记录。对于右表中在左表无匹配的行,结果中左表对应列会为 NULL。

-- LEFT JOIN: all employees, including those with no department
SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments
ON employees.dept_id = departments.dept_id;

-- RIGHT JOIN: all departments, including those with no employees
SELECT employees.name, departments.dept_name
FROM employees
RIGHT JOIN departments
ON employees.dept_id = departments.dept_id;

想更细致地了解其中细微差别,请阅读我们的 SQL LEFT JOIN 与 LEFT OUTER JOIN 指南。

4. 为什么联接在 SQL 管理中很重要?

SQL 联接在 SQL 管理中至关重要,原因包括:

  • SQL 联接是整合多张表、便于阅读与分析的关键方法。
  • 它们为访问并整合数据库信息提供了一种高效、易用的方式。
  • 使用联接可减少数据库中的数据占用与存储。

5. 什么是 OUTER JOIN?

OUTER JOIN 会返回匹配值以及来自一张或两张表的不匹配值。LEFT JOIN、RIGHT JOIN 和 FULL JOIN 都属于 OUTER JOIN。详尽对比可参阅我们的 SQL INNER JOIN 与 OUTER JOIN 教程。

6. 什么是 INNER JOIN?

INNER JOIN 仅返回在两张(或多张)表中满足定义的联接条件的记录。这是 SQL 的默认联接。

7. 什么是 CROSS JOIN?

CROSS JOIN 会创建笛卡尔积,即将第一张表的每一行与第二张表的每一行组合。这会产生一份行数等于两张表行数乘积的数据集。

8. 能否将一张 SQL 表与其自身进行联接?

可以,通常通过所谓的自联接(self-join)来实现。自联接是一种用于比较同一张表内行的联接方式。与联接两张或多张表的其他 SQL 联接不同,自联接是将一张表与其自身联接。

9. FULL JOIN 与 CROSS JOIN 有何区别?

FULL JOIN 返回两张表中的所有记录,包括满足 ON 条件的匹配记录。若无匹配,则也会包含所有行,但未匹配列以 NULL 填充。

相较之下,CROSS JOIN 返回来自两张表的所有行的所有可能组合,得到的是一个笛卡尔积。由于不依赖任何限制输出的条件,这通常会比 FULL JOIN 的结果大得多。

10. 在 SQL 联接中使用别名的目的是什么?

随着查询变复杂,名称可能变得冗长难用。为提高清晰度,我们可以使用别名为查询中的项目(包括列与表)指定新名称。要为对象指定别名,可以使用 AS 子句。

10 道 SQL 联接进阶面试题

11. 什么是 EQUI JOIN?

EQUI JOIN 是一种基于等号(=)匹配条件,将两张或多张表的行组合起来的联接操作。它用于检索指定列中取值相等的数据。

EQUI JOIN 与 INNER JOIN 返回相同结果,只是语法不同,如下例所示:

SELECT COURSES.name, TECHNOLOGIES.name
FROM COURSES, TECHNOLOGIES
WHERE COURSES.technology_id = TECHNOLOGIES.technology_id;
SELECT COURSES.name, TECHNOLOGIES.name
FROM COURSES
INNER JOIN TECHNOLOGIES
ON COURSES.technology_id = TECHNOLOGIES.technology_id;

12. 联接中 ON 与 USING 子句有何区别?

通常使用 ON 关键字来指定两张表中的公共列以完成联接。当用于联接的列在两张表中名称相同,USING 子句可作为简写。

例如,若 COURSES 与 TECHNOLOGIES 两张表都有名为“technology_id”的公共列,则可以使用以下查询:

SELECT * FROM COURSES 
JOIN TECHNOLOGIES
USING (technology_id);

13. 什么是 NATURAL JOIN?

NATURAL JOIN 会基于两张表中的同名列创建联接。这些同名列即为公共列。

延续上题示例,我们可以将同一查询写为:

SELECT * FROM COURSES 
NATURAL JOIN TECHNOLOGIES

14. JOIN 子句与 UNION 子句有何区别?

JOIN 子句用于基于两张或多张表的公共列,将数据合并成新的列。

相比之下,UNION 子句用于将两条或多条 SELECT 语句的结果按行合并为新的行。换言之,UNION 用于按行拼接数据集。为避免错误,UNION 中的每条 SELECT 语句必须具有相同的列数,且列的数据类型需相近。相关操作的完整概览请参阅我们的 SQL 集合运算符 指南。

15. 什么是半联接(semi-join)?

半联接查询通常以子查询的形式执行,仅从第一张(左)表中选取满足在第二张表中匹配的某一条件(或一组条件)的行。与常规联接会包含两张表的匹配行不同,半联接的结果只包含左表的列。

-- Semi-join using EXISTS: find customers who have placed orders
SELECT customer_id, customer_name
FROM customers
WHERE EXISTS (
    SELECT 1 FROM orders
    WHERE orders.customer_id = customers.customer_id
);

16. 什么是反联接(anti-join)?

反联接(又称反半联接)与半联接正好相反。在反联接中,仅从第一张表中选取在第二张表中不满足某一条件(或一组条件)的行。

-- Anti-join using NOT EXISTS: find customers who have never ordered
SELECT customer_id, customer_name
FROM customers
WHERE NOT EXISTS (
    SELECT 1 FROM orders
    WHERE orders.customer_id = customers.customer_id
);

17. INTERSECT 子句与 INNER JOIN 有何区别?

INNER JOIN 基于指定的关系(通常使用共享列或字段作为联接条件)将两张或多张表的数据合并,结果只包含满足联接条件的行。

而 INTERSECT 子句不要求表之间有直接关系。它针对完整的 SELECT 语句工作,只返回两个结果集中共有的行。要使用 INTERSECT,相关 SELECT 语句必须具有相同的列数且数据类型兼容。

18. 使用 CROSS JOIN 时应考虑哪些性能问题?

由于 CROSS JOIN 会将第一张表的每一行与第二张表的每一行配对组合,这可能生成极其庞大的表,尤其当参与联接的表本就很大时。因此,使用 CROSS JOIN 时需谨慎,它很可能消耗大量资源并引发性能问题。

19. 您如何理解条件联接(conditional JOIN)?

条件联接是一种强大的技术,可基于特定条件合并来自多张表的数据,从而创建更具动态性与灵活性的查询。条件联接有助于数据库管理员定义可包含额外语句(包括聚合函数、比较运算符与逻辑运算符)的自定义查询。

20. 在 SQL 联接中,WHERE 与 ON 子句有何区别?

ON 子句用于指定联接条件,换言之,用于定义表应如何联接。具体来说,您需在此定义记录如何匹配。

相对地,WHERE 子句用于指定过滤条件,即定义哪些行应保留在结果集中。包含过滤条件的联接可视为条件联接。

要了解 SQL 处理查询的完整顺序——包括 ON 与 WHERE 的评估时机——请参阅我们的 SQL 执行顺序 指南。

不同类型 SQL 联接对比

下表对不同类型的 SQL 联接进行了简明清晰的对比,便于读者理解每种联接适用的具体场景:

联接类型 定义 使用场景
INNER JOIN 仅返回两张表中具有匹配值的行。 当需要检索两张表中匹配值的记录时使用。常用于通过外键关联的数据合并。
LEFT JOIN(LEFT OUTER JOIN) 返回左表的所有行以及右表中与之匹配的行。左表中无匹配的行,其右表对应列为 NULL。 当需要获取左表的所有记录,并在可用时带出右表的匹配数据时很有用。常用于找出一张表的所有条目,并查看其在另一张表中是否有对应项。
RIGHT JOIN(RIGHT OUTER JOIN) 返回右表的所有行以及左表中与之匹配的行。右表中无匹配的行,其左表对应列为 NULL。 类似 LEFT JOIN,但侧重右表。当需要无论是否匹配都返回右表的所有记录时使用。
FULL JOIN(FULL OUTER JOIN) 当左右任一表有匹配记录时返回所有行。若无匹配,则在无匹配的一侧以 NULL 表示。 当需要合并任一表中存在的数据,同时捕获两张表的未匹配数据时很有用。
SELF JOIN 将一张表与其自身进行联接。 当需要比较同一张表内的行时使用,例如查找层级数据中的关系或比较不同行的取值。
CROSS JOIN 生成两张表的笛卡尔积,即将第一张表的每一行与第二张表的每一行组合。 通常用于需要两组数据的所有组合的情形,例如生成测试数据或探索所有可能的组合。

为您的 SQL 联接面试做准备

充分准备 SQL 面试对于顺利通过这一环节至关重要。正如我们所见,需要学习的联接知识点并不少。如果您想要一份对初学者友好的 SQL 联接指南,我们强烈建议您阅读我们的 SQL 联接入门。或者,如果您希望扎实掌握联接,最佳方式就是多加练习。看看我们的 SQL 数据联接课程,通过表联接与关系集合论为您的查询“加速”。

关于 SQL 联接,还有很多可聊的内容。在大多数 SQL 面试中,这只是面试官考察您 SQL 熟练度的众多话题之一。为帮助您熟悉最常见的 SQL 面试题,我整理了以下指南:

由于面试的不确定性较高,这一环节往往容易让人感到压力。毕竟,知道题目只是一部分,另一部分是懂得如何在面试中应对。

为助您顺利通关,这里有几点提示与技巧。

  • 没人指望您无所不知。缺少某个特定技能很正常。如果公司要求用 R 给出方案,而您只会用 Python,那就展示您用 Python 解决问题的能力,并表达愿意学习 R 的态度。
  • 三思而后答。如果问题需要,争取更多思考时间。这表明您认真对待他们的问题。但不要对每个问题都这样做。
  • 说明您的角色为何关键。有时,尤其在小公司,他们可能并不完全清楚为何需要数据科学家。如果出现这种情况,强调您如何通过改进现有产品或创建新方案来提升公司影响力与利润。
  • 行业有别。在不同行业担任数据从业者的体验可能差别很大。生物科技公司与云服务商大不相同。花些时间了解公司所在领域的特性,并展示您愿意学习。然而,从根本上说,所有人都在与数据打交道,而无论行业如何,处理数据的方法具有相似性。
  • 面对拒绝。这是当今竞争激烈就业市场的现实。从错误中学习,持续学习新技能并打磨旧技能。向更资深的员工请教,尤其是从事数据科学的员工。如果应聘不成功,也可以向面试官索要反馈意见。

结语

您做到了!希望这份常见 SQL 联接面试题清单能帮助您备考并在面试中脱颖而出。祝您在接下来的 SQL 面试中一切顺利。

同时,如果您觉得自己的 SQL 技能还需要增强,DataCamp 可以帮助您。下面列出了一些我们的课程、学习路径与专门的 SQL 资料,助您提升技能:


Javier Canales Luna's photo
Author
Javier Canales Luna
LinkedIn

我是一名自由职业的数据分析师,与全球各地的公司和组织合作开展数据科学项目。我也担任数据科学讲师,拥有2年以上授课经验。我经常用英语和西班牙语撰写与数据科学相关的文章,其中一些已发表在 DataCamp、Towards Data Science 和 Analytics Vidhya 等知名网站上。作为一名具有政治学与法律背景的数据科学家,我的目标是在公共政策、法律与技术的交汇处开展工作,借助思想的力量推动创新解决方案与叙事,帮助我们应对紧迫挑战,尤其是气候危机。我认为自己是自学成才、不断进步的人,坚定支持跨学科合作。学习新事物永远不嫌晚。

主题
数据分析
SQL

今天就开启您的 SQL 之旅!

课程

SQL 入门

2 小时
1.6M
两小时学会用 SQL 创建和查询关系型数据库。
查看详情开始课程

课程

SQL 中级

4 小时
529.9K
在每一步都有实践查询陪伴,这门课程教你立即用自己的 SQL 代码分析数据所需的一切!

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多