首页 文章

MySQL中的's the purpose of specifying a condition in ' Full Outer Join'是什么?

提问于
浏览
1

我有一个'完全外部加入'的以下查询:

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 回答

  • 3

    当您在 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 ,这意味着,一个表的每一行都与每一行相关联从另一张 table ,这是一个完全不同的东西 .


    为了使这个答案更具有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
    

相关问题