MySQL留疑问:left join时选on还是where?

全新前后端微商城项目,手把手教学!

前天写 SQL 时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。

后来发现 join on and 不会过滤结果记录条数,只会根据 and 后的条件是否显示 B 表的记录,A 表的记录一定会显示。

不管 and 后面的是A.id=1还是B.id=1,都显示出 A 表中所有的记录,并关联显示 B 中对应 A 表中 id 为 1 的记录或者 B 表中 id 为 1 的记录。

运行 sql:

SELECT *
FROM student s
 LEFT JOIN class c ON s.classId = c.id
ORDER BY s.id

de89f1a5c7f00e2759ffca4c6fe78501.png

运行 sql:

SELECT *
FROM student s
 LEFT JOIN class c
 ON s.classId = c.id
  AND s.name = '张三'
ORDER BY s.id

06480a5e1e538a732a37fbe4a0fdd2ff.png

运行 sql:

SELECT *
FROM student s
 LEFT JOIN class c
 ON s.classId = c.id
  AND c.name = '三年级三班'
ORDER BY s.id

4e5b869bc025b7a4dd72c3cd965a3ae2.png

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left join时,onwhere条件的区别如下:

  • on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

  • where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表 1:tab2

32b09f2d9f02994c9c830c3f5f13c493.png

表 2:tab2

8d26dcd80b3f5ec51c3041185a51cbc9.png

两条 SQL:

第一条:

select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’

第二条:

select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条 SQL 的过程:

1、中间表 on 条件:

tab1.size = tab2.size

07f9fcf0527fc5ea264eaefc3af377f5.png

2、再对中间表过滤 where 条件:

tab2.name=’AAA’

5e0a0078b828082998f84a8333581a5c.png

第二条 SQL 的过程:

1、中间表 on 条件:

tab1.size = tab2.size and tab2.name=’AAA’

PS:条件不为真也会返回左表中的记录

e5599c1e3cf8a3bbd887d029a32ee7ea.png

其实以上结果的关键原因就是left joinright joinfull join的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。

inner jion没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

来源:blog.csdn.net/wqc19920906/

article/details/79785424


推荐全新学习项目

全新基于 springboot+vue+vant 的前后端分离的微商城项目,包括手机端微商城项目和后台管理系统,整个电商购物流程已经能流畅支持,涵盖商品浏览、搜索、商品评论、商品规格选择、加入购物车、立即购买、下单、订单支付、后台发货、退货等。功能强大,主流技术栈,非常值得学习。

线上演示:https://www.markerhub.com/vueshop

4e6fce97c3e8493b1e11bb8c40c7c072.jpeg

从文档到视频、接口调试、学习看板等方面,让项目学习更加容易,内容更加沉淀。全套视频教程约 35 小时共 222 期,讲解非常详细细腻。下面详细为大家介绍:

架构与业务

使用主流的技术架构,真正手把手教你从 0 到 1 如何搭建项目手脚架、项目架构分析、建表逻辑、业务分析、实现等。涵盖 SpringBoot、Mybatis Plus、Jwt、Redis、Lombok、Hutool、Shiro、Elasticsearch、RabbitMq、Docker、Jenkins 等技术。

vueshop 微商城的整个购物流程已经完善,各个模块的业务都是已经实现,涵盖商品模块、搜索模块、购物车模块、订单模块、退款模块、后台权限模块、业务数据管理模块等

28b0952dd9314710cf7b3bb4ed1791fa.png

更多详情请查看:

手把手教学,从 0 开发前后端微商城项目,主流 Java 技术一网打尽!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值