理解 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 JOIN
的 email
将结果限制为仅 email_id
和 person
中都存在匹配 email
的行。 person
中具有匹配 address
但 email_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 JOIN
和 city
假定 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中文网其他相关文章!