A left join B 和 B right join A

本文深入探讨了SQL中左连接(left join)与右连接(right join)的实际应用效果,通过实例对比说明两者在处理一对多关系数据时的等效性。同时,文章强调了小表驱动大表的原则,即在连接操作中应优先选择记录较少的表作为驱动表,以提高查询效率。

先说结论,A left join B 和 B right join A效果是一样一样的。

left  join(左链接)where条件语句只影响右表,右表存在符合条件的记录则展示,否则为null,右表多出的数据不展示。

右链接雷同。

例:

表a,用户信息表,表b,用户的积分流水记录表。

left join:

SELECT a.merchant_id,a.member_id,a.wid,b.point_flow_id 
FROM `cc_member_card_main_info_6` a 
left join `cc_point_log_6` b  
on a.merchant_id = b.merchant_id and a.member_id = b.member_id 
WHERE a.merchant_id = 870;

左链接结果:

right join:

SELECT a.merchant_id,a.member_id,a.wid,b.point_flow_id 
FROM `cc_point_log_6` b  
right join `cc_member_card_main_info_6` a 
on a.merchant_id = b.merchant_id and a.member_id = b.member_id 
WHERE a.merchant_id = 870;

右链接结果:

 

结果相同,同时可以看到,表a(用户信息表)和表b(用户流水记录表)是一对多的关系,对应的多条记录都会被查找出来。

---------

在另一个文章看到另外一个点:小表驱动大表原则。参考https://blog.youkuaiyun.com/huangfan322/article/details/50516851

意思是说,查到的记录以符合条件的,记录少的表为主。

以左链接为例:

修改查询语句,添加记录id限定条件,sql语句如下:

SELECT a.merchant_id,a.member_id,a.wid,b.point_flow_id 
FROM `cc_member_card_main_info_6` a 
left join `cc_point_log_6` b  
on a.merchant_id = b.merchant_id and a.member_id = b.member_id 
WHERE b.merchant_id = 870 and b.point_flow_id < 3000;

运行结果:

用户信息共19条,用户积分记录共9条,查询结果只展示了5条。

在SQL中,`LEFT JOIN` `RIGHT JOIN` 是用于从两个或多个表中检索数据的连接操作。它们的主要区别在于保留哪一侧的数据以及如何处理不匹配的行。 ### LEFT JOIN 的行为 `LEFT JOIN`(有时称为 `LEFT OUTER JOIN`)会返回左表中的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配,则结果集中右表的列将包含 `NULL` 值。例如,考虑两个表 A B,当执行以下查询: ```sql SELECT A.*, B.* FROM A LEFT JOIN B ON A.k = B.k; ``` 此查询将返回 A 表的所有行,并且对于那些在 B 表中找不到匹配项的 A 行,B 表的字段将会是 `NULL` [^3]。 ### RIGHT JOIN 的行为 `RIGHT JOIN`(有时称为 `RIGHT OUTER JOIN`)则与 `LEFT JOIN` 相反,它返回右表的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配,则结果集中左表的列将包含 `NULL` 值。例如,执行以下查询: ```sql SELECT A.*, B.* FROM A RIGHT JOIN B ON A.k = B.k; ``` 此查询将返回 B 表的所有行,并且对于那些在 A 表中找不到匹配项的 B 行,A 表的字段将会是 `NULL` [^4]。 ### LEFT JOINRIGHT JOIN 的等价性 理论上,`LEFT JOIN` `RIGHT JOIN` 可以说是互为镜像,因为可以通过交换表的位置来达到相同的效果。也就是说,一个 `LEFT JOIN` 查询可以转换成一个 `RIGHT JOIN` 查询,只需交换两个表的位置。例如,上面提到的 `LEFT JOIN` 查询等同于下面的 `RIGHT JOIN` 查询: ```sql SELECT A.*, B.* FROM B RIGHT JOIN A ON A.k = B.k; ``` 因此,在功能上,这两个查询会产生相同的输出 [^2]。 然而,在实际应用中,通常推荐使用 `LEFT JOIN` 而避免使用 `RIGHT JOIN`,因为大多数数据库系统支持 `LEFT JOIN` 更广泛,并且 `LEFT JOIN` 更直观地表达了“保留左表所有记录”的意图 [^1]。 ### 总结 尽管 `LEFT JOIN` `RIGHT JOIN` 在某些情况下可以互换并产生相同的结果集,但它们并不是完全等价的,主要取决于具体的业务需求数据结构。选择使用哪一个取决于需要保留哪个表的所有记录 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值