当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2014-10-04

    本文导语:  今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期                  交易次数   交易金额 2009-4-01           1              10 2009-4-02           2            ...

今天遇到一个求某月所有天数的统计结果,如果某日的结果是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中,返回的结果集是相同的。


    
 
 

您可能感兴趣的文章:

  • 深入JDBC sqlserver连接写法的详解
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解
  • 深入SQLServer中ISNULL与NULLIF的使用详解
  • 深入C++可见性与生命期的区别详解
  • 深入mysql并发插入优化详解
  • 深入android Unable to resolve target 'android-XX'详解
  • 深入MYSQL字符数字转换的详解
  • 深入SQL Server中定长char(n)与变长varchar(n)的区别详解
  • 深入C#任务管理器中应用程序选项隐藏程序本身的方法详解
  • 深入Windows下的回车是回车换行(rn)还是换行回车(nr)的详解
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解
  • 深入C# 内存管理以及优化的方法详解
  • 深入c# Func委托的详解
  • 深入分析Java内存区域的使用详解
  • Informatica bulk与normal模式的深入详解
  • 深入JAVA对象深度克隆的详解
  • 深入mysql存储过程中表名使用参数传入的详解
  • 深入SQL截取字符串(substring与patindex)的详解
  • 深入Java不可变类型的详解
  • 深入Android开发FAQ的详解
  • 深入oracle特定信息排序的分析
  • 深入理解Oracle数据库的启动和关闭
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 深入解析Oracle参数及参数文件
  • 深入探讨:Oracle中如何查询正锁表的用户以及释放被锁的表的方法
  • Oracle表连接深入浅出
  • 深入剖析哪些服务是Oracle 11g必须开启的
  • 深入分析关于Oracle数据库的备份策略
  • [Oracle] RAC 之 - 负载均衡深入解析
  • Oracle 9i数据库中动态重配置深入分析
  • 深入ORACLE变量的定义与使用的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • 博客 iis7站长之家
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入分析C中不安全的sprintf与strcpy
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • 请问JFC是否有必要深入研究?
  • 如何深入了解某个平台系统的底层


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3