SQL JOIN:INNER JOIN 是否会覆盖前面的 OUTER JOIN?
本文探讨了 SQL 查询中 INNER JOIN
和 OUTER JOIN
子句之间的交互,特别讨论后续 INNER JOIN
是否会抵消前面 OUTER JOIN
的效果。
简短的回答是:不,不会自动。 然而,INNER JOIN
可以显着限制前面OUTER JOIN
的效果。
关键在于ON
的INNER 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.id
是 NULL
),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 JOIN
和 OUTER JOIN
之间的相互作用对于编写高效且正确的 SQL 查询至关重要。 仔细考虑所有连接的 ON
子句,以确保它们符合所需的行为。
以上是SQL 中 INNER JOIN 是否会覆盖前面的 OUTER JOIN?的详细内容。更多信息请关注PHP中文网其他相关文章!