编程后端开发者

解释SQL中INNER JOIN和OUTER JOIN(LEFT、RIGHT、FULL OUTER JOIN)之间的区别,以及如何在不同的数据处理场景中选择合适的连接类型。请举出每种JOIN的正确使用示例。

用 Hintsage AI 助手通过面试

答案

INNER JOIN仅返回在两个连接表中根据指定条件找到匹配的记录。使用OUTER JOIN(LEFT、RIGHT、FULL)时,结果包含来自一个或两个表的所有行,即使在另一个表中没有匹配。

  • LEFT OUTER JOIN:来自左表的所有行+来自右表的匹配(如果有,否则为NULL)。
  • RIGHT OUTER JOIN:来自右表的所有行+来自左表的匹配(如果有,否则为NULL)。
  • FULL OUTER JOIN:来自两个表的所有行,未匹配的值均为NULL。

何时使用哪种JOIN:

  • 如果只需要匹配的行,则使用INNER JOIN。
  • LEFT JOIN——如果左表中的所有行都很重要,无论是否存在匹配。
  • RIGHT JOIN——类似,但适用于右表。
  • FULL OUTER JOIN——完整的合并列表(有助于查找不匹配)。

示例:

-- INNER JOIN SELECT u.id, u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- LEFT OUTER JOIN SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- FULL OUTER JOIN SELECT u.id, o.order_id FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;

令人困惑的问题

如果右表为空,LEFT JOIN会给出什么结果?

人们常常回答:“LEFT JOIN会返回空结果,因为没有匹配。”正解是:无论如何,LEFT JOIN将返回左表中的所有行,右表的列将为NULL

示例:

-- users表有记录,orders为空 SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id=o.user_id; -- 结果:所有用户,o.amount = NULL

由于不了解细节而导致的实际错误示例


故事

销售分析项目。为了输出客户及其订单的完整列表,使用了INNER JOIN,跳过了没有订单的客户。报告中丢失了“重要”客户,因为他们在右表中缺失。解决方案:使用LEFT JOIN。


故事

员工和部门管理平台。使用RIGHT JOIN代替LEFT JOIN导致在添加新部门时出现混乱:一些员工未能出现在报告中。原因——混淆了连接的顺序。


故事

数据架构迁移。更改后,由于连接条件中的拼写错误,某个JOIN变成了CROSS JOIN。结果——查询量剧增和数据的“膨胀”。结论:在连接时始终指明ON并仔细检查JOIN的类型。