在 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 JOINLEFT/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 的“完全外连接”中指定条件的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Count() 中指定条件?

在 Xcode 中指定子项目的配置

在 MySQL 连接字符串中指定密码

如何使用多个条件查找查询在 MongoDB 中指定字段?

Spring Cloud Bus,如何在 /bus/refresh?destination= 中指定多个目的地?

如何在Laravel中的find()方法中指定两个或更多条件?