首页 > 数据库 > mysql教程 > SQL 中的 LEFT JOIN:'ON”和'WHERE”子句之间的主要区别是什么?

SQL 中的 LEFT JOIN:'ON”和'WHERE”子句之间的主要区别是什么?

Barbara Streisand
发布: 2025-01-03 00:18:40
原创
631 人浏览过

LEFT JOIN in SQL:  What's the Key Difference Between `ON` and `WHERE` Clauses?

带条件的 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中文网其他相关文章!

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