在 MySQL 的“完全外连接”中指定条件的目的是啥?
Posted
技术标签:
【中文标题】在 MySQL 的“完全外连接”中指定条件的目的是啥?【英文标题】:What's the purpose of specifying a condition in 'Full Outer Join' in MySQL?在 MySQL 的“完全外连接”中指定条件的目的是什么? 【发布时间】:2016-01-16 17:53:02 【问题描述】:我有一个“完全外部连接”的以下查询:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
据我所知,MySQL 中的“完全外连接”的目的是返回左表(客户)中的所有行,以及右表(订单)中的所有行。
如果“客户”中有行在“订单”中没有匹配,或者如果“订单”中有行在“客户”中没有匹配,这些行也会被列出。
我的疑问/查询是,如果 MySQL 中的“完全外连接”将返回两个表中的行,而不管匹配元素如何,那么是否有必要在 WHERE 子句中指定条件?不能跳过吗?
请给我关于 MySQL RDBMS 的规范和中肯的答案。
谢谢。
【问题讨论】:
mysql 中没有FULL JOIN
,您不需要指定WHERE
子句,尽管没有任何先验因素阻止您这样做。
【参考方案1】:
当您在 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
,这意味着,一个表的每一行都与另一个表的每一行相关联,这是完全不同的事情。
为了使这个答案更具体到 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
【讨论】:
我一直被告知我的头很大。现在这是在腰带以下;-) 有趣...所以通过使用WHERE
子句,您隐含地承认对条件进行空检查。
我的总体感觉和观察是,这里有很多人甚至不花 5 分钟搜索 SO 或 Google,就在这里提出问题。所以我开始对结束问题感到高兴,但我会退后一点。感谢您的反馈。以上是关于在 MySQL 的“完全外连接”中指定条件的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章