何时使用右连接或完全外连接

Posted

技术标签:

【中文标题】何时使用右连接或完全外连接【英文标题】:When to use right join or full outer join 【发布时间】:2020-03-21 08:33:08 【问题描述】:

我几乎每天都在使用 DB/SQL,而且我使用 sql 的次数越多,我就越认为没有理由使用右连接或完全外连接。

假设我们有两个表:table1 和 table2。要么我想接收 table1 中行的附加信息,所以我可以在 table2 上使用内部连接,如果我想在没有匹配的情况下保留原始行,那么我使用左连接:

如果我必须向表 2 添加其他信息,我可以执行相同的操作并将表 2 连接到表上。所以我看不出为什么我应该使用正确的连接。是否有任何用例不能使用左连接进行右连接?

我还想知道我是否需要完整的外部联接。为什么要连接两个表并保留两个表不匹配的行?我们也可以通过使用两个左连接来实现这一点。

【问题讨论】:

右外连接在我看来完全是多余的。您始终可以使用左外连接编写相同的查询,哇,突然查询变得可读了 :-) 我个人的建议是从不使用右外连接。 完全外连接很少需要。但在那些适当方法的极少数情况下,应该使用它们。用两个方向的左外连接和UNION 来模拟它们来组合结果有点尴尬,而且可读性和可维护性要差得多。 这能回答你的问题吗? What is the purpose (or use case) for an outer join in SQL? 【参考方案1】:

为什么要连接两个表并保留两个表不匹配的行?

完全联接在某些情况下很有用。其中之一是比较两个表的差异,例如表之间的异或:

 SELECT * 
 FROM t1
 FULL JOIN t2
   ON t1.id = t2.id
 WHERE t1.id IS NULL 
    OR t2.id IS NULL;

例子:

t1.id ... t2.id
1         NULL
NULL      2

您也可以通过使用两个左连接来实现这一点。

是的,你可以:

SELECT t1.*, t2.*
FROM t1
LEFT JOIN t2
  ON t1.id = t2.id
WHERE t2.id IS NULL
UNION ALL
SELECT t1.*, t2.*
FROM t2
LEFT JOIN t1
  ON t1.id = t2.id
WHERE t1.id IS NULL;

某些 SQL 方言不支持FULL OUTER JOIN,我们以这种方式模拟它。 相关:How to do a FULL OUTER JOIN in mysql?


另一方面,RIGHT JOIN 在您必须加入 2 个以上的表时很有用:

SELECT *
FROM t1
JOIN t2 
  ...
RIGHT JOIN  t3
 ...

当然,您可以争辩说您可以通过更改连接顺序或使用子查询(内联视图)将其重写为相应的形式。从开发人员的角度来看,拥有工具总是好的(即使您不必使用它们)

【讨论】:

太棒了。谢谢你的四位cmets。所以我们确实可以只使用普通连接和左连接。希望几年前有人告诉我;)

以上是关于何时使用右连接或完全外连接的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

MySQL面试题

SQL中的左连接与右连接,内连接有啥区别

如何在 C# 中进行完全外连接? [复制]

左外连接右外连接内连接全连接的概念

SQL的四种连接-左外连接右外连接内连接全连接