服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

SQL 语句中 left join 后用 on 还是 where,区别大了!

日期: 来源:石杉的架构笔记收集编辑:jcpp9527
「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 

文章来源:http://t.csdn.cn/0FMXV


前天写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

运行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 jion时,on和where条件的区别如下:

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

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

假设有两张表:

表1:tab2

idsize
110
220
330

表2:tab2

sizename
10AAA
20BBB
30CCC

两条SQL:

1、

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

2、

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’

(条件不为真也会返回左表中的记录)


其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

欢迎扫码加入儒猿技术交流群,每天晚上20:00都有Java面试、Redis、MySQL、RocketMQ、SpringCloudAlibaba、Java架构等技术答疑分享,更能跟小伙伴们一起交流技术


另外推荐儒猿课堂的9.9元系列课程给您,欢迎加入一起学习~


互联网Java工程师面试突击课
(9.9元专享)

SpringCloudAlibaba零基础入门到项目实战
9.9元专享)

亿级流量下的电商详情页系统实战项目
9.9元专享)

Kafka消息中间件内核源码精讲
9.9元专享)

12个实战案例带你玩转Java并发编程
9.9元专享)

Elasticsearch零基础入门到精通
9.9元专享)

基于Java手写分布式中间件系统实战
9.9元专享)

基于ShardingSphere的分库分表实战课
9.9元专享)

相关阅读

  • 2w 字带你实战 ElasticSearch!

  • 原价199元,现在参加拼团活动立享优惠价仅 99 元,赶快一起参团吧!《百万数据量下的高性能商品搜索系统实战》=== 课程福利 ===为了让更多同学学到赚到,《百万数据量下的高性能商
  • ChatGpt实现的短消息发送Redis限流功能

  • 「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 」文章来源:【公众号:业余草】前言ChatGpt实现的短信发送Redis限流功能本文的内容和源码都来自于 ChatGpt,大家感受一下 ChatG
  • 7min 到 40s:SpringBoot 启动优化实践!

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源:https://juejin.cn/post/71813425237285929550 背景公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓
  • Spring Boot中一个注解优雅实现重试

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。重试,在项目需求中是非常常见的,例如遇到网络波动等,要求某个接口或者是方法可以最多/最少调用几次;实现重试机制,非得用Ret
  • Spring Boot 项目鉴权的 4 种方式

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。文章介绍了spring-boot中实现通用auth的四种方式,包括 传统AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最
  • Spring Boot配置保存日志文件

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。springboot日志配置:springboot默认日志是打印再console中的,不会保存在文件中。我们项目上线肯定要保存日志用于分析的
  • 又有城市设立“人才日”,还要思考什么?

  • 文|朱晓帆继宁波、南通、温州之后,又一座城市以法定形式为人才设立了专属的节日。 湖州市景观 新华网发 4月24日,浙江湖州市人大常委会会议表决通过《关于设立“湖州人才日”

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四
  • 美国对华2000亿关税清单,到底影响有多大?

  • 1 今天A股大跌,上证最大跌幅超过2%。直接导火索是美国证实计划对华2000亿美元产品加征25%关税。 听起来,2000亿美元数目巨大,我们来算笔账。 2000亿美元,按现在人民币汇率

最新文章

  • 2w 字带你实战 ElasticSearch!

  • 原价199元,现在参加拼团活动立享优惠价仅 99 元,赶快一起参团吧!《百万数据量下的高性能商品搜索系统实战》=== 课程福利 ===为了让更多同学学到赚到,《百万数据量下的高性能商
  • 被坑惨了!盘点Kafka一些非比寻常的坑!

  • 原价299元,现在参加拼团活动立享优惠价仅 149 元,赶快一起参团吧!《Kafka架构设计与内核源码深度剖析》=== 课程背景 ===无论在跳槽面试还是实际工作中,Kafka都是必不可少的一环