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

时间:2020-03-21 08:33:08

标签: sql join

我几乎每天都在使用DB / SQL,并且我使用sql的次数越多,我越认为没有必要使用右联接或完全外部联接。

假设我们有两个表:table1和table2。我想接收有关table1中行的其他信息,以便可以在table2上使用内部联接,如果要保留原始行(如果没有匹配项),则使用左联接:

left join enter image description here

如果我必须向表2添加其他信息,则可以执行相同的操作,并将表2保留在表上。因此,我不知道为什么我应该使用正确的联接。有没有无法将左联接用于右联接的用例?

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

1 个答案:

答案 0 :(得分:1)

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

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

 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很有用:

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

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