本文共 1793 字,大约阅读时间需要 5 分钟。
前天写 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.idORDER BY s.id
运行 sql:
SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id AND s.name = '张三'ORDER BY s.id
运行 sql:
SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id AND c.name = '三年级三班'ORDER BY s.id
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left join
时,on
和where
条件的区别如下:
on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join
的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表 1:tab2
表 2:tab2
两条 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
2、再对中间表过滤 where 条件:
tab2.name=’AAA’
第二条 SQL 的过程:
1、中间表 on 条件:
tab1.size = tab2.size and tab2.name=’AAA’
PS:条件不为真也会返回左表中的记录
其实以上结果的关键原因就是left join
,right join
,full join
的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
而inner jion
没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。
来源:blog.csdn.net/wqc19920906/
article/details/79785424
全新,包括手机端微商城项目和后台管理系统,整个电商购物流程已经能流畅支持,涵盖商品浏览、搜索、商品评论、商品规格选择、加入购物车、立即购买、下单、订单支付、后台发货、退货等。功能强大,主流技术栈,非常值得学习。
线上演示:https://www.markerhub.com/vueshop
从文档到视频、接口调试、学习看板等方面,让项目学习更加容易,内容更加沉淀。全套约 35 小时,共 222 期,讲解非常详细细腻。下面详细为大家介绍:
使用主流的技术架构,真正手把手教你从 0 到 1 如何搭建项目手脚架、项目架构分析、建表逻辑、业务分析、实现等。涵盖 SpringBoot、Mybatis Plus、Jwt、Redis、Lombok、Hutool、Shiro、Elasticsearch、RabbitMq、Docker、Jenkins 等技术。
vueshop 微商城的整个购物流程已经完善,各个模块的业务都是已经实现,涵盖商品模块、搜索模块、购物车模块、订单模块、退款模块、后台权限模块、业务数据管理模块等
更多详情请查看: