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

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

DDD
发布: 2024-12-29 22:45:24
原创
706 人浏览过

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

左连接重温:ON 和 WHERE 子句的区别

在 SQL Server 中,LEFT JOIN 操作在检索数据中起着至关重要的作用来自多个表。然而,在 ON 子句和 WHERE 子句中指定连接条件之间存在微妙但显着的差异。

考虑以下查询:

SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
登录后复制

此查询尝试从以下位置检索 f2 列:表 t1,同时可选地根据 f1 列中的匹配值和附加条件(cond2 和 t2.f3 > )连接表 t2 中的行。

相比之下,以下查询采用不同的方法:

SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2
WHERE t2.f3 > something
登录后复制

这里,连接条件仅在 ON 子句中指定,而 t2.f3 > 则仅在 ON 子句中指定。在 WHERE 子句中添加某些条件作为过滤器。

理解差异

这两个查询之间的主要区别在于操作顺序:

  • ON 子句: 指定用于识别连接匹配行的条件。不满足这些条件的行将从连接结果集中排除。
  • WHERE 子句: 根据附加条件从连接结果集中过滤行。

示例

为了说明这种区别,请考虑一个候选表(候选人)和投票表(选票):

candidates
| name        |
|-------------|
| Obama        |
| Romney        |

votes
| voter       | voted_for |
|-------------|-------------|
| Mickey Mouse | Romney      |
| Donald Duck  | Obama       |
登录后复制

查询 1:

SELECT *
FROM candidates c
LEFT JOIN votes v
ON c.name = v.voted_for AND v.voter = 'Donald Duck'
登录后复制

此查询检索所有候选人,包括 Romney,即使唐老鸭投票给了奥巴马。这是因为 ON 子句中指定了 v.voter = 'Donald Duck' 条件,该条件仅影响 join 操作。

查询 2:

SELECT *
FROM candidates c
LEFT JOIN votes v
ON c.name = v.voted_for
WHERE v.voter = 'Donald Duck'
登录后复制

在此查询中,v.voter = 'Donald Duck' 条件被移至 WHERE 子句。结果,罗姆尼被排除在结果集中,因为他没有得到唐老鸭的匹配选票。仅返回获得唐老鸭投票的奥巴马。

结论

理解 LEFT JOIN 操作中 ON 和 WHERE 子句的区别对于有效检索至关重要SQL Server 中的数据。通过仔细地将条件放置在适当的子句中,您可以控制匹配条件并有效地过滤连接的结果集。

以上是SQL Server 中的 LEFT JOIN:'ON”和'WHERE”子句之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

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