INNER JOIN仅返回在两个连接表中根据指定条件找到匹配的记录。使用OUTER JOIN(LEFT、RIGHT、FULL)时,结果包含来自一个或两个表的所有行,即使在另一个表中没有匹配。
何时使用哪种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的类型。