首页 >数据库 >mysql教程 >INNER JOIN 是否会覆盖 OUTER JOIN 包含的 NULL 值?

INNER JOIN 是否会覆盖 OUTER JOIN 包含的 NULL 值?

DDD
DDD原创
2025-01-09 10:36:41398浏览

Does an INNER JOIN Override an OUTER JOIN's Inclusion of NULL Values?

理解 SQL 中 INNER 和 OUTER JOIN 的交互

复杂的 SQL 查询经常使用多个 JOIN 操作,组合不同的 JOIN 类型。 一个关键的考虑因素是,当随后应用 INNER JOIN 时,NULL 值(OUTER JOIN 的一个特征)的包含会受到怎样的影响。

INNER JOIN 如何影响 OUTER JOIN 结果

INNER JOIN 本质上只返回 两个 表中满足联接条件的行。 如果 INNER JOIN 跟在 OUTER JOIN 之后,并且 INNER JOIN 的条件依赖于可能为 NULL 的列(由于 OUTER JOIN),则它会有效地过滤掉这些列为 NULL 的行。这会否定 OUTER JOIN 最初提供的 NULL 值的包含。

说明性示例

让我们看一个场景:

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;</code>

LEFT JOIN 确保包含 person 表中的所有行,即使 address 中没有匹配的条目。 但是,带有 INNER JOINemail 将结果限制为仅 email_idperson 中都存在匹配 email 的行。 person 中具有匹配 addressemail_id 为 NULL 的行将被排除。

有问题的场景及其解决方案

考虑这个查询:

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;</code>

这里,INNER JOINcity 假定 address.city_id 永远不会为 NULL。 如果某些地址缺少 city_id,这些行(以及相关的 person 行)将被省略,从而无意中更改初始 LEFT JOIN.

的结果

正确的做法是使用另一个LEFT JOIN代替INNER JOIN

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;</code>

这保留了初始 LEFT JOIN 的包容性,正确处理 address.city_id 可能为 NULL 的情况。 这可确保包含所有 person 记录,无论它们是否有与其关联的地址或城市。

以上是INNER JOIN 是否会覆盖 OUTER JOIN 包含的 NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn