左连接和 WHERE 子句的怪癖
在执行数据检索操作时,开发人员经常使用左连接来组合来自多个表的信息。然而,当将 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'
直观上,人们会希望该语句在 tableThree 和 tableTwo 之间执行左连接,指定 c.foobar 的过滤条件。然而,包含 c.foobar = 'somethingelse' 的 WHERE 子句的存在无意中改变了左连接的特征。
当左连接右侧的值(在本例中为 c.foobar)为包含在 WHERE 子句中时,只有值为 NOT NULL 的行才会包含在结果集中。因此,左连接的行为实际上类似于内部连接,消除了 c.foobar.
的所有具有 NULL 值的行。要保留上例中左连接的预期行为,可以采用以下任一方法方法:
以上是左连接和 WHERE 子句:它们如何交互,以及如何避免意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!