连表查询--leftjoin⽤法
相信刚接触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
11ss
23xx
⼆、错误的实现
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' ;
sql left join 多表连接从语义上理解根据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 for
m A as a left join B as b on b.a_id = a.id ⽣成⼀张AB临时表
AB表
aid aname aage bid bname
1张三121ss
2李四24NULL NULL
3王⼆132xx
第⼆步:执⾏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张三121ss
2李四24NULL NULL
3王⼆132xx
第⼆步:执⾏where之后的条件筛选AB表中的数据。
aid aname aage bid bname
2李四24NULL NULL
参考⽂档:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论