首页 > 数据库 > mysql教程 > WHERE 子句如何影响 SQL 中 LEFT JOIN 的行为?

WHERE 子句如何影响 SQL 中 LEFT JOIN 的行为?

Barbara Streisand
发布: 2025-01-03 20:58:43
原创
672 人浏览过

How Does a WHERE Clause Affect a LEFT JOIN's Behavior in SQL?

WHERE 子句中左联接的行为

在 SQL 中,左联接旨在包含左表中的所有行,即使存在右表中没有匹配的行。但是,某些条件可以改变此默认行为。

考虑以下查询:

SELECT
a.foo,
b.bar,
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = 'something'
AND c.foobar = 'somethingelse'
登录后复制

在此查询中,tableTwo 和 tableThree 之间的左联接实际上被转换为内联接,因为WHERE 子句中的条件 c.foobar = 'somethingelse'。这是因为在 WHERE 子句中从左联接的右侧指定非 NULL 值(此处为“somethingelse”)会消除相应列为 NULL 的任何行,从而导致内联接行为。

因此,查询仅返回 tableOne 和 tableTwo 中与 tableThree 中具有非 NULL 值 c.foobar 的行相匹配的行。要保持所需的左连接行为,请考虑以下解决方案:

1.在 WHERE 子句中包含 NULL:

将条件 c.foobar = 'somethingelse' 替换为 AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) 以包含 foobar 为 ' 的行其他'或 NULL。

2.将条件移动到连接谓词:

将 c.foobar = 'somethingelse' 条件从 WHERE 子句移动到连接谓词:

LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
登录后复制

通过这样做,查询保留左连接行为,同时仍然根据 c.foobar 的值过滤掉行。

以上是WHERE 子句如何影响 SQL 中 LEFT JOIN 的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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