深入Oracle的left join中on和where的区别详解-阿里云开发者社区

开发者社区> 科技探索者> 正文

深入Oracle的left join中on和where的区别详解

简介:
+关注继续查看

今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 

日期                  交易次数   交易金额 

2009-4-01           1              10 

2009-4-02           2              20 

2009-4-03           0              0 

2009-4-04          5                50 

一开始我用的左连接,用on做为两表关联条件,用where作为过滤条件,但是发现0的数据根本不显示,后来把where关键字去掉,把过滤条件都放到on里,问题解决,网上一搜,找到了答案: 

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


在使用left jion时,on和where条件的区别如下: 

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

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


假设有两张表: 


表1 tab1: 

id size 

1 10 

2 20 

3 30 

表2 tab2: 

size name 

10 AAA 

20 BBB 

20 CCC

两条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 

tab1.id    tab1.size    tab2.size     tab2.name 

1               10                   10               AAA 

2              20                     20             BBB 

2             20                      20               CCC 

3             30                    (null)              (null) 

2、再对中间表过滤 

where 条件: 

tab2.name='AAA' 

tab1.id       tab1.size        tab2.size     tab2.name 

1                  10                  10              AAA

第二条SQL的过程: 

1、中间表 

on条件: 

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

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

tab1.id      tab1.size         tab2.size       tab2.name 

1               10                     10                   AAA 

2               20                   (null)               (null) 

3               30                    (null)                 (null) 


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

本文转自12691034博客51CTO博客,原文链接http://blog.51cto.com/12701034/1929934如需转载请自行联系原作者

笑容掩饰爱

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
restore和recover的区别
restore 是还原物理文件 recover 是用日志恢复到一致 用了RMAN备份后就必须要用restore还原,然后才用recover恢复 restore——还原,与backup相对,从备份读出恢复备份的数据。
691 0
Oracle中会话与事务有什么区别?
        一个会话可以启动多个事务,会话是session,指一次连接。         事务是指一个操作单元,要么成功,要么失败,没有中间状态。         会话中可以完成多个事务。 例如:         会话好比,在应用程序中连接数据库要执行连接,然后会关闭,这算一次会话。         事务呢,就好比在打开会话后要执行程序中的某一个或多个对数据库进行的操作。
702 0
html中的src与href的区别
  写代码的时候就经常把这两个属性弄混淆,到底是href还是src,href标识超文本引用,用在link和a等元素上,href是引用和页面关联,是在当前元素和引用资源之间建立联系,src表示引用资源,表示替换当前元素,用在img,script,iframe上,src是页面内容不可缺少的一部分。
567 0
oracle date 和 timestamp区别
在今天的工作中,学到了以下几个知识点: 一、date和timestamp 的区别      date类型是Oracle常用的日期型变量,他的时间间隔是秒。两个日期型相减得到是两个时间的间隔,注意单位是“天”。
976 0
xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编 - (void)test { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.
738 0
【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例
JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK 1.5之前,实现任务的周期性调度主要使用的是Timer类和TimerTask类。本文,就简单介绍下ScheduledThreadPoolExecutor类与Timer类的区别,ScheduledThreadPoolExecutor类相比于Timer类来说,究竟有哪些优势,以及二者分别实现任务调度的简单示例。
77 0
Inner Join, Left Outer Join和Association的区别
测试用的CDS视图的源代码,第8行用Inner Join连接TJ02T, 后者存放了所有系统状态的ID和描述。 Inner Join测试结果:对于那些在TJ02T里没有维护描述信息的状态,它们不会出现在结果集里。
1444 0
5489
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载