sql中left join和right join混用

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


这里该怎么理解呢?

感谢http://blog.csdn.net/sqlserverdiscovery/article/details/6893288

我们理解的时候可以把它拆成两部分去理解

比如第一部分

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


可见,与上面的结果是一样的,当然这是我们理解的过程,实际数据库服务器执行的时候可能不是这样的,它会做一些优化,提高效率






  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLLEFT JOINRIGHT JOIN是两种表连接操作。LEFT JOIN返回左表的所有记录以及右表与左表匹配的记录,而RIGHT JOIN则返回右表的所有记录以及左表与右表匹配的记录。 具体来说,LEFT JOIN将左表的每一行与右表的相应行进行比较,并返回包括左表所有的行以及与其匹配的右表的行。如果右表没有与左表匹配的行,则结果集右表的相关列将包含NULL值。 相反,RIGHT JOIN将右表的每一行与左表的相应行进行比较,并返回包括右表所有的行以及与其匹配的左表的行。如果左表没有与右表匹配的行,则结果集左表的相关列将包含NULL值。 这两种连接操作的主要区别在于返回结果左表和右表的顺序。在LEFT JOIN,左表是主要的,而在RIGHT JOIN,右表是主要的。也就是说,LEFT JOIN返回左表的所有记录,而RIGHT JOIN返回右表的所有记录。 这里还需要注意的是,如果同时使用LEFT JOINRIGHT JOIN来连接两个表,这实际上就是一个完全外连接(FULL OUTER JOIN),返回两个表的所有记录。 以下是一个使用LEFT JOINRIGHT JOIN的示例: 假设我们有两个表:Customers和Orders。Customers表包含客户信息,而Orders表包含订单信息。我们想要获取所有客户以及他们的订单信息。我们可以使用LEFT JOIN将Customers表与Orders表连接,以获取所有客户及其订单的信息。同时,我们也可以使用RIGHT JOIN将Orders表与Customers表连接,以获取所有订单及其对应的客户信息。 SELECT Customers.CustomerName, Orders.OrderNumber FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID; 以上查询将返回所有客户的姓名以及他们的订单号。如果某个客户没有订单,则订单号列将显示为NULL。 SELECT Orders.OrderNumber, Customers.CustomerName FROM Orders RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID; 以上查询将返回所有订单的订单号以及它们对应的客户姓名。如果某个订单没有对应的客户信息,则客户姓名列将显示为NULL。<span class="em">1</span><span class="em">2</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值