连表查询--left join用法

相信刚接触mysql的时候,可能遇到以下的情况:

标准查询关键字执行顺序为 FROM->WHERE->GROUP BY->HAVING->ORDER BY

LEFT JOIN 是在 FROM 范围内 所以先 ON 条件筛选表,然后两表再做 LEFT JOIN

而对于 WHERE 来说是在 LEFT JOIN 结果再次筛选

一、场景及要求:

A表有三条数据对应1、2、3;B表有两条数据对应1、2;A表中的1对应 B表的1,A表中3对应B表的2。我想过滤数据(条件是A.id != 1 && B.name != 'xx')得到A表中的2。

A表

id

name

age

1

张三

12

2

李四

24

3

王二

13

 

B表

id

a_id

name

1

1

ss

2

3

xx

二、错误的实现

select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id where a.id !=1 and b.name != 'xx' ;

从语义上理解根据a.id !=1和b.name != 'xx'是可以查询到想要的数据。但是这个sql运行之后你什么都得不到。为什么那?

我先来看看mysql怎么执行这条sql语句的。

第一步:先执行select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id生成一张AB临时表

AB表

aid

aname

aage

bid

bname

1

张三

12

1

ss

2

李四

24

NULL

NULL

3

王二

13

2

xx

第二步:执行where之后的条件筛选AB表中的数据为空

你可能对aid=2这条记录不满足条件有疑问!原因是aid = 2这一行中有关b表的数据都是不存在的,所以数据库不会对这行数据进行搜索匹配。(我的理解是bid和bname的是值为NULL不是null)

 

三、正确实现方案

select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id where a.id !=1 and (b.name != 'xx' or b.id is NULL);

执行顺序:

第一步:先执行select a.id as aid,a.name as aname,a.aage as age.b.id as bid,b.name as bname form  A as a left join B as b on b.a_id = a.id 生成一张临时表AB表(AB表名称是随便取的)

 

AB表

aid

aname

aage

bid

bname

1

张三

12

1

ss

2

李四

24

NULL

NULL

3

王二

13

2

xx

 

第二步:执行where之后的条件筛选AB表中的数据。

aid

aname

aage

bid

bname

2

李四

24

NULL

NULL

参考文档:

https://blog.csdn.net/minixuezhen/article/details/79763263

https://www.cnblogs.com/lzh007blog/p/7656428.html

https://blog.csdn.net/sinat_30397435/article/details/52492272

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无尘--老徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值