在MySQL中“完全外部加入”中指定条件的目的是什么?

时间:2015-10-18 09:49:25

标签: mysql join rdbms outer-join full-outer-join

我对'Full Outer Join'进行了以下查询:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

据我所知, MySQL 中“Full Outer Join”的目的是返回左表(Customers)中的所有行,以及右表(Orders)中的所有行。

如果“客户”中的行中没有“订单”中的匹配项,或者“订单”中的行中没有“客户”中的匹配项,则也会列出这些行。

我怀疑/查询是否 MySQL 中的'Full Outer Join'将从两个表中返回行而不管匹配元素是否有必要在WHERE子句中指定条件?我不能跳过它吗?

请给我关于 MySQL RDBMS的规范和答案。

感谢。

1 个答案:

答案 0 :(得分:3)

当您在WHERE子句中指定某些内容时,您必须确保检查NULL值,例如:

...
WHERE (col1 = 'whatever' OR col1 IS NULL)
AND (col2 = 'other_value' OR col2 IS NULL)
...

如果您未检查NULLFULL OUTER JOIN实际上已成为INNER JOINLEFT/RIGHT JOIN

如果您输入了拼写错误,并且“为什么要在ON子句中指定条件?”,那么答案是没有ON条款,JOIN实际上是CROSS JOIN 1}},这意味着,一个表的每一行都与另一个表的每一行相关联,这是完全不同的事情。

为了使这个答案更具有MySQL特定性,MySQL中实际上没有FULL OUTER JOIN,您必须使用LEFT JOIN ... UNION ... RIGHT JOIN来模拟它。但仍然适用同样的原则。

a left join b using (id)
where b.col1 = 'x'

相同
a inner join b using (id)
where b.col1 = 'x'

你实际上必须像

一样写
a left join b on a.id = b.id and b.col1 = 'x'

真的有一个左连接。或者当然

a left join b using (id)
where b.col1 = 'x' or b.col1 is null