我对'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的规范和答案。
感谢。
答案 0 :(得分:3)
当您在WHERE
子句中指定某些内容时,您必须确保检查NULL
值,例如:
...
WHERE (col1 = 'whatever' OR col1 IS NULL)
AND (col2 = 'other_value' OR col2 IS NULL)
...
如果您未检查NULL
,FULL OUTER JOIN
实际上已成为INNER JOIN
或LEFT/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