sql中left join和right join混用

sql中leftjoin和rightjoin混⽤
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的⾏
如上所⾔,我们只做⼀下left join的实验,right join和left join 类似
测试⼀共三张表,a b c

表结构和数据分别如下

a表

b表

c表

然后我们来试⼀下左连接 1, 我们来查询a b两张表,连接他们aid=bid的选项 sql>>SELECT * FROM a LEFT JOIN b on aid=bid
看图很好理解,因为是a左连接b,所以b中为空的元素 ,在查询结果中以NULL的形式补全 同理可得 sql>>SELECT * FROM a LEFT JOIN c on aid=cid
sql>>SELECT * FROM c LEFT JOIN b on bid=cid sql>>SELECT * FROM c LEFT JOIN b on cid=bid
也就是on后⾯的顺序⽆所谓,⽆论是bid=cid还是cid=bid,重点是前⾯的left join还是right join

2,我们来试⼀下如果三张表左连接呢,会有什么情况? sql>>SELECT * FROM a
LEFT JOIN b on bid=aid LEFT JOIN c on aid=cid
sql>>SELECT * FROM a LEFT JOIN b on bid=aid LEFT JOIN c on bid=cid
3,如果我⽤了⼀个right join呢? sql>>SELECT * FROM a LEFT JOIN b on bid=aid RIGHT JOIN c on bid=cid
这⾥该怎么理解呢? 我们理解的时候可以把它拆成两部分去理解 ⽐如第⼀部分 sql>>SELECT * FROM a LEFT JOIN b on bid=aid

然后再思考第⼆部分,假如上图是⼀张表 我们叫它a_b 你可以新建⼀个视图,就可以真成为⼀张虚表了 sql>>create VIEW a_b as (SELECT * FROM a LEFT JOIN b on bid=aid)
然后我们继续做下⾯⼀部分 sql>>select * from a_b right join c on bid=cid
可见,与上⾯的结果是⼀样的,当然这是我们理解的过程,实际数据库服务器执⾏的时候可能不是这样的,它会做⼀些优化,提⾼效率


--------------------------------------------------------

posted @   明月镇魂  阅读(227)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示