当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

转载于:https://my.oschina.net/learnbo/blog/910198

相关文章:

  • 怎样让百度快速收录的新方法
  • 把两个字段的和作为新的字段
  • vagrant
  • 为女票写的计算工作时间的SQL
  • bug优先级别
  • 分析器错误消息: 该配置节不能包含 CDATA 或文本元素。
  • Anroid开发中常用快捷键
  • linux学习 – shell脚本
  • Web性能测试工具推荐
  • openstack一键安装(最新版)
  • DBeauty 3.2.6 发布,数据关系浏览器
  • 互联网金融MySQL优化参数标准
  • ndoe.js回掉函数
  • Nodejs
  • 第一天 开始Linux 征途了
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • css属性的继承、初识值、计算值、当前值、应用值
  • Elasticsearch 参考指南(升级前重新索引)
  • If…else
  • leetcode386. Lexicographical Numbers
  • mysql常用命令汇总
  • PaddlePaddle-GitHub的正确打开姿势
  • PAT A1092
  • Rancher-k8s加速安装文档
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 半理解系列--Promise的进化史
  • 使用SAX解析XML
  • 物联网链路协议
  • 小程序01:wepy框架整合iview webapp UI
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​人工智能书单(数学基础篇)
  • (2)Java 简介
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (转)jQuery 基础
  • .NET Core WebAPI中封装Swagger配置
  • .NET中 MVC 工厂模式浅析
  • @RequestMapping 的作用是什么?
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [BZOJ 3282] Tree 【LCT】
  • [C# 网络编程系列]专题六:UDP编程
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [Codeforces] probabilities (R1600) Part.1
  • [C语言]——柔性数组
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [Hive] 常见函数
  • [HJ73 计算日期到天数转换]
  • [JavaWeb玩耍日记]Maven的安装与使用
  • [luogu2165 AHOI2009] 飞行棋 (枚举)
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记