内部联接和外部联接:了解它们的交互
本文探讨了在 SQL 查询中组合 INNER JOIN 和 OUTER JOIN(LEFT、RIGHT 或 FULL)如何影响最终结果集。 具体来说,我们将检查后续的 INNER JOIN 是否可以覆盖前面的 OUTER JOIN 的行为。
连接顺序的影响
关键在于每个连接的ON
子句。 如果后面的 INNER JOIN 的 ON
子句需要来自因 OUTER JOIN 而可能为 NULL 的列的非空值,则后面的 INNER JOIN 只会抵消早期 OUTER JOIN 的效果。 简单地改变连接顺序并不能解决这个问题;相反,需要将 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>
如果将 LEFT JOIN
放在 INNER 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
,person
上的 address
都会失败,因为 address.city_id
可能为 NULL。 解决方案是将 INNER JOIN
替换为 LEFT JOIN
。
提高可读性和效率的推荐实践
为了提高代码的可读性和可维护性,最佳实践是对连接进行逻辑排序。 首先放置 INNER JOIN,因为它们代表核心关系,然后放置 OUTER JOIN。虽然 RIGHT OUTER JOIN 不太常见,但通常建议避免使用它们,转而使用 LEFT OUTER JOIN 以保持一致性。 这种方法清楚地反映了基本的数据关系和 OUTER JOIN 引入的可选扩展。
以上是INNER JOIN 可以覆盖 OUTER JOIN 的结果吗?的详细内容。更多信息请关注PHP中文网其他相关文章!