首页 > 数据库 > mysql教程 > SQL 中 INNER JOIN 是否会覆盖前面的 OUTER JOIN?

SQL 中 INNER JOIN 是否会覆盖前面的 OUTER JOIN?

Mary-Kate Olsen
发布: 2025-01-09 10:22:40
原创
816 人浏览过

Does an INNER JOIN Override a Preceding OUTER JOIN in SQL?

SQL JOIN:INNER JOIN 是否会覆盖前面的 OUTER JOIN?

本文探讨了 SQL 查询中 INNER JOINOUTER JOIN 子句之间的交互,特别讨论后续 INNER JOIN 是否会抵消前面 OUTER JOIN 的效果。

简短的回答是:不,不会自动。 然而,INNER JOIN 可以显着限制前面OUTER JOIN的效果。

关键在于ONINNER JOIN子句。如果 ON 子句由于 NULL 而需要可能为 OUTER JOIN 的列,则 INNER JOIN 将有效过滤掉该列为 NULL 的行。 这并不是完全忽略 OUTER JOIN 意义上的“覆盖”,而是一种过滤效果。

示例 1:INNER JOIN 不会否定 OUTER JOIN

<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>
登录后复制

这按预期工作。 INNER JOIN 上的 email 仅需要有效的 person.email_id。 即使某人没有地址(address.idNULL),LEFT JOIN 仍然包含他们,如果他们有电子邮件,INNER JOIN 包含该电子邮件数据。

示例 2:INNER JOIN 限制 OUTER JOIN

<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 需要非 NULL address.city_id。 由于 LEFT JOIN 上的 address 可能会生成带有 NULL address.city_id 的行,因此这些行被 INNER JOIN 排除。 OUTER JOIN的效果受到严格限制。

解决方案: 要保留示例 2 中 OUTER JOIN 的行为,请将 INNER JOIN 更改为 LEFT 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>
登录后复制

最佳实践:

  • 虽然不是严格要求,但将 INNER JOIN 放在 OUTER JOIN 之前可以提高可读性,因为 INNER JOIN 代表更严格的条件。
  • 请谨慎使用 RIGHT JOIN,因为它们可能不如 LEFT JOIN 直观。 通常,交换表格的 LEFT JOIN 会更清楚地实现相同的结果。

理解 INNER JOINOUTER JOIN 之间的相互作用对于编写高效且正确的 SQL 查询至关重要。 仔细考虑所有连接的 ON 子句,以确保它们符合所需的行为。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板