我几乎每天都在使用DB / SQL,并且我使用sql的次数越多,我越认为没有必要使用右联接或完全外部联接。
假设我们有两个表:table1和table2。我想接收有关table1中行的其他信息,以便可以在table2上使用内部联接,如果要保留原始行(如果没有匹配项),则使用左联接:
如果我必须向表2添加其他信息,则可以执行相同的操作,并将表2保留在表上。因此,我不知道为什么我应该使用正确的联接。有没有无法将左联接用于右联接的用例?
我还想知道我是否需要完整的外部联接。您为什么要联接两个表并保留两个表都不匹配的行?我们还可以通过使用两个左联接来实现这一点。
答案 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
...
当然,您可能会争辩说,可以通过更改连接顺序或使用子查询(内联视图)将其重写为对应的形式。从开发人员的角度来看,拥有工具总是很好的(即使您不必使用它们)