left join 或right join 加上where条件后连接失效,等同于inner join

做项目写SQL时,在使用left join 和where 时混淆了,网上找到了如下案例,记录一下。
原因:where是先连接然后再筛选 

举例:

表1:

  

表2:

查询语句:select * from tab1 left JOIN tab2  on (tab2.id=tab1.id) where tab2.hobby = "游泳";

结果:

过程:

首先根据左连接生成如下中间表:

再根据where 条件进行过滤,筛选出hobby = "游泳"的一条记录,最终查询结果只有上述的一条记录。     所以left join 失效。

解决办法:将where 换成and 即:

查询的具体过程:将(tab2.hobby='游泳')作为条件放到 left join on 里面时,是对tab2里面的记录做过滤,也就是只会查出tab2中hobby='游泳的这一条数据和tab1进行拼接,具体查询结果如下所示。

查询语句:select * from tab1 left join tab2 on (tab2.id=tab1.id) and  (tab2.hobby='游泳');


————————————————
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于这个问题,我可以给出以下解释: 在关系型数据库中,join 是一种用于将两个或多个表中的数据相关联的操作。根据 join 的类型和查询条件,数据库系统会选择不同的算法来执行 join 操作。 左连接left join),右连接right join)和内连接inner join)是 join 操作中最常见的三种类型。它们的区别在于返回结果中是否包含没有匹配的行。 当索引失效时,意味着数据库无法使用索引来加速 join 操作,而会退化为全表扫描。这可能会导致 join 操作的性能下降。 对于内连接inner join),数据库通常可以使用索引来加速匹配操作,因为它只返回两个表中匹配的行。而左连接和右连接则需要返回左表或右表中没有匹配的行,这就可能导致索引失效。 当左连接或右连接的索引失效时,我们可以尝试通过以下方式来优化查询性能: 1. 确保被连接的列上存在合适的索引。例如,在左连接中,可以尝试在右表上创建索引。 2. 考虑调整查询语句的顺序。有时候,将被连接的表放在前面,可以使得查询计划选择更合适的索引。 3. 使用子查询或临时表来改写查询语句,以避免索引失效的问题。 总的来说,内连接更容易使用索引来加速查询,而左连接和右连接可能会导致索引失效。在实际应用中,我们需要根据具体的情况选择合适的 join 类型,并进行优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值