sql连接查询语句中on和where过滤有什么区别?

分类:编程技术 时间:2024-02-20 15:25 浏览:0 评论:0
0
本文将详细讲解SQL连接查询语句中on和where过滤的区别。小编觉得还是比较实用的,所以分享给大家,作为参考。希望您读完本文后有所收获。 。

让我们看一个例子。有两个数据表。结构和数据如图所示。

表main

表ext

这两个表可以看做是用于存储用户信息。主表保存主要信息,分表保存附加信息。两张表 表的关系是1对1,以id字符作为对应的关系键。现在我们需要过滤掉所有地址不是杭州的用户信息,并且结果需要包含主表和ext表中的所有字段数据。

select * from main left JOIN exton main.id = ext.id 和地址<>'杭州'

闭上眼睛开动你的大脑,用人肉运行这个SQL,想象一下结果会是什么。

当过滤条件address<>'杭州'放在on后面时,查询得到的结果似乎和我们预期的不一样。从结果可以看出,这个过滤条件似乎只过滤出了ext表中对应的记录,但主表中的记录并没有过滤掉,也就是上图中红色标记的记录。 outer join相对于inner join的一个主要特点是它是基于一侧的表,但是这里使用左连接可以忽略过滤条件表为基础。有点太霸道了。

稍微改变一下查询语句,将地址的过滤条件从on转移到where

select * from main left JOIN ext on main.id = ext.id where address <> '杭州'

结果如下我们所预料的

结果的差异是从外连接查询的逻辑查询的各个阶段开始的。

一般来说,外连接的执行过程分为4步

1、首先对两个表进行交叉连接(笛卡尔积)

2.应用于过滤器

3.添加外部行

4.应用where过滤器

直接使用上面的即可,不用对于where过滤器的sql,整个详细的执行流程如下

第一步,对两个表进行交叉连接。结果如下。这一步会生成36条记录(这张图没有完全显示)

第二步应用on过滤器。过滤器中有两个条件main.id = ext.id和address<>'杭州',符合要求的记录如下

这似乎是我们期望的查询结果,但是这个结果将是e 下一步打乱

第三步是添加外部行。 外连接的一个特点是它基于一侧的表。如果对方的表没有满足on过滤条件的记录,则使用null代替。在这个查询中,这一步的作用是把本来应该被过滤掉的记录加回来

这不是多余的吗?结果是这样的

第四步应用where过滤

这题sql中,因为没有where过滤,所以结果上一步的结果是这样的。

对于where条件中过滤地址的sql,这一步的作用是过滤掉所有地址不属于杭州的记录

< p >通过上面的解释,我们已经可以体现出on和where中outer join中过滤条件的区别了。如果开发人员能够理解其中的差异详细来说,他们可以避免很多写sql的问题。过程中出现了莫名其妙的错误。

关于“SQL连接查询语句中on和where过滤有什么区别?”这篇文章就分享到这里,希望以上内容能够给大家带来一些帮助,所以让你可以学到更多的知识,如果你觉得文章不错,请留下分享,让更多的人看到。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > sql连接查询语句中on和where过滤有什么区别?

用户评论