语句1 select a.* from a left join b on a.id=b.id 结果470条
语句2 select a.* from a left join b on a.id=b.id and a.Name='张三' 结果445条
语句3 select a.* from a left join b on a.id=b.id where a.Name='张三' 结果1条
语句4 select a.* from a left join b on a.Name='张三' 结果603条
语句2中查出来的数据有部分的name不等于'张三'
语句2为什么会查出不等于张三的数据?原因是什么?为什么语句4会查出来601条?它默认关联的字段又是那个呢?
我换了数据准确的几张表来做实验所以更改了一些数字,
a表id 唯一 name不重名 可能为空
b表id不唯一
第二句,是以on a.id=b.id and a.Name='张三'作为关联关系,拼接数据;结果是能拼接的数据+未匹配上的数据(因为用的left,会将a表所有数据显示出来)
第四句,会查询出a中的是“张三”的数据,和b中的所有数据拼接,然后在加上a中所有不是“张三的数据”
语句2 a表b表中存在id相等,且name='张三'的数据。
这种时候已经符合了匹配条件才对啊,为什么会返回a表本身呢?
语句4,a中张三的数据只有一条,而且在b表中也只有一条,返回的数量是两表总量+1.
@子明: 语句2是因为用的left,name='张三'只是a、b表拼接条件,并不是最后的过滤条件
语句4,:a中的“张三”*b + a剩余所有数据
@子明: 语句2,用join是你想要得
你回答的很有问题,但感觉你已经很认真的回答的样子就给你了。。
2和3的查询时等价的,你仔细检查你的查询结果,
4,笛卡尔乘积,你在on子句中写上 1=1 也行
23不等价,我可以确定以及肯定。内链接才会等价,我之所以贴出3是因为了说明3才是我想要的,凸显2为什么会查处来的数据不对
3是笛卡尔积后,重新使用where查询。如果使用的是join(内连接),才是相同的
@子明: 哦,看错,2,3 不等价,
2:left join 左侧的a表数据必须全部保留,至于and a.name='张三',你可以认为'张三'=b.name,那意思你就明白了
3:where是最后一个filter,对查询结果进行过滤
我的理解:语句2的and,只有符合才会去关联b表,不符合的只返回a表本身。
返回的数据是a表本身,为什么呢?之前的删掉干嘛,本来还想着回复你的
@子明: left join 就是以左表为基础的,a表的数据会全部显示,
你的a表对b表是一对多的关系吧,a表和b表id字段相同,则a就会多出一些相同id的数据,这是a.id=b.id的作用
语句2呢,a.id=b.id and a.Name='张三' 你把它看作整个关联条件。
通俗点讲,语句1显示的是a表的数据和a.id=b.id关联部分的数据
语句2显示的是a表的数据和a.id=b.id and a.Name='张三' 关联部分的数据
个人建议:表连接就是表连接,搜索条件就是搜索条件。如果都这么写,那还要where子句干嘛?搜索条件还是写在where子句里面合适,你这种写法,就算知道了出错原因,也没有什么实际价值。
就事论事,不喜勿喷
我刚试了一下,你说的没错,确实有这些问题。
你用left join为左连接查询,它以a表为主,查询a表和b表相等的部分和b表没有a表相等的就与null填充,查出来的时候a表有几条就显示几条(这就是语句2出现问题的结果),最后跟本就删选不出想得到的数据而where正好过滤了这些用null来显示的数据。
(个人理解,希望对你有所启发)
执行一边,看一下执行计划就知道怎么回事