带条件的 LEFT JOIN:ON 和 WHERE 之间的区别在哪里?
在 SQL Server 中,LEFT JOIN 根据以下条件组合来自两个表的行指定的连接条件。 ON 子句定义 LEFT JOIN 语句中的联接条件,而 WHERE 子句则在联接操作之后过滤行。如果没有正确理解,这种微妙的区别可能会导致意外的结果。
考虑以下查询:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
令人惊讶的是,此查询不会产生与以下查询相同的结果:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
解释
ON子句在确定哪些行参与联接方面起着至关重要的作用。 ON 中指定的条件必须为真,才能匹配并包含在连接结果中的行。相反,WHERE 子句过滤已经连接的行。
在第一个查询中,条件 t2.f3 > some 是 ON 子句的一部分。因此,只有 t2.f3 大于某值的行才会包含在连接中。这意味着 t2.f3 不大于某值的任何匹配行都将从结果中排除。
在第二个查询中,条件 t2.f3 > some 是 WHERE 子句的一部分。该子句在执行连接后进行评估。因此,满足 ON 子句条件(t1.f1 = t2.f1 和 cond2)的所有行都将成为联接结果的一部分。然后,WHERE 子句过滤这些行,仅保留 t2.f3 大于某值的行。
示例
为了说明这个概念,请考虑一个候选表 (候选人)和投票表(选票)。如果我们想查找已收到选票的候选人,我们可以使用 LEFT JOIN:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for
此查询返回所有候选人,甚至包括那些没有收到任何选票的候选人。如果我们将条件移至 WHERE 子句:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voted_for IS NOT NULL
结果现在仅包括至少获得一票的候选人。
结论
理解 LEFT JOIN 中 ON 和 WHERE 子句的区别对于有效操作数据至关重要。通过仔细地将条件放入适当的子句中,您可以确保您的查询返回所需的结果。
以上是SQL 中的 LEFT JOIN:'ON”和'WHERE”子句之间的主要区别是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!