l?e?f?t? ?j?o?i?n? ?o?n? ?a?n?d?与?l?e?f?t? ?j?o?i?n? ?o?n? ?w?h?e?r?e?的?区?别(转载)

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

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

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

2where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有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上的条件是否为真都会返回leftright表中的记录,full则具有left和right的特性的并集。
而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。


我的实验

select count(*) from T_EXPERT expert0_ left outer join T_GENERAL_REVIEWER
generalrev1_ on expert0_.C_ID=generalrev1_.C_REVIEWER_ID and
(generalrev1_.C_YEAR=2014);  --共140659条数据

select count(*) from t_general_reviewer where c_year = 2014;
--共121255条数据

select count(*) from t_expert where c_id not in (select c_reviewer_id from
t_general_reviewer group by c_reviewer_id,c_year having c_year = 2014);
--共19404条数据

19404+121255 = 140659条数据

分析如下:

执行第一条语句时,首先是查出了满足条件二的数据,不满足条件二的reviewer_id(即expert中的id)也会查出来,只是对应表t_general_reviewer中的字段显示为空

l?e?f?t? ?j?o?i?n? ?o?n? ?a?n?d?与?l?e?f?t? ?j?o?i?n? ?o?n?
?w?h?e?r?e?的?区?别(转载),码迷,mamicode.com

l?e?f?t? ?j?o?i?n? ?o?n? ?a?n?d?与?l?e?f?t? ?j?o?i?n? ?o?n?
?w?h?e?r?e?的?区?别(转载)

时间: 2024-08-08 18:27:08

l?e?f?t? ?j?o?i?n? ?o?n? ?a?n?d?与?l?e?f?t? ?j?o?i?n? ?o?n? ?w?h?e?r?e?的?区?别(转载)的相关文章

<转>thinkphp的各种内部函数 D()、F()、S()、C()、L()、A()、I()详解

D.F.S.C.L.A.I 他们都在functions.php这个文件家下面我分别说明一下他们的功能 D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C() 获取配置值    用法就是   C("这里填写在配置文件里数组的下标")S() 全局缓存配置 用法S(“这里相当于一个唯一的标识”)F() 快速文件数据读取和保存 针对简单类型数据 字符串.数组I()   快速创建一个对象实例 以上如果有遗漏的 内部函数 ThinkPHP值得大家学习

POJ-3126 暑假集训-搜索进阶F题http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/F

经验就是要认真细心,要深刻理解.num #include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<ctype.h>#include<queue>using namespace std;#define N 11000 typedef struc

NYOJ 12 喷水装置(二)

pid=12">喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每一个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪所有润湿. 输入 第一行输入一个正整数N表示共同拥有n次測试数据. 每一组測试数据的第一行有三个整数n,w,h,n表示共同拥有n个喷水装置,w表示草坪的

CVPR 2017 Paper list

CVPR2017 paper list Machine Learning 1 Spotlight 1-1A Exclusivity-Consistency Regularized Multi-View Subspace Clustering Xiaojie Guo, Xiaobo Wang, Zhen Lei, Changqing Zhang, Stan Z. Li Borrowing Treasures From the Wealthy: Deep Transfer Learning Thro

Echarts 中国地图(包括china.js文件)

用Echarts写中国地图需要导入china.js(现在官方不提供下载,个人找的在最下面有),根据需要的效果如下.位置可以自己在option里面修改 1 <!DOCTYPE html> 2 <html> 3 <head> 4 首先,引入jquery.js echarts.js china.js(必要) 5 <script src="/jquery.js"></script> 6 <script src="ech

AtCoder Grand Contest 020 题解

传送门 怎么又是\(tourist\)神仙的题-- \(A\) 咕咕 int n,a,b; int main(){ scanf("%d%d%d",&n,&a,&b); puts(((b-a-1)&1)?"Alice":"Borys"); return 0; } \(B\) 考虑从后往前做,假设考虑到\(a_i\),且只考虑第\(a_{i+1}\)到\(a_n\)的答案为\(s\),那么考虑了\(a_i\)的答案\(

HDU 4777 Rabbit Kingdom

素因子分解,树状数组.$ACM/ICPC$ $2013$杭州区域赛$H$题. 首先需要处理出数字$a[i]$左边最远到$L[i]$,右边最远到$R[i]$区间内所有数字都与$a[i]$互质. 那么对于左端点在$[L[i],i]$并且右端点在$[i,R[i]]$的询问,$a[i]$就可以作出一个贡献. 接下来的问题就可以转化为二维平面上有很多矩形,每次询问一个点被多少矩形覆盖.可以离线操作,类似于扫描线的思想做就可以了. 素因子分解需要一开始把$20$万个数字都处理好,避免每组测试数据内重复处理.

Vim练级笔记(持续更新)

漫漫练级路...作为一个VS重度依赖患者,又加上visual assist X 这种懒人必备的神级插件,转投vim门下,真是各种疼... vim用着用着就有拿鼠标去点的冲动,有木有啊! 不过经过一段时间的使用,慢慢感受到vim那深不可测的强大.... ? (emacs什么鬼,,,) 下面就说说我的练级历程, ? 第一课, 先从一个非常好的资料开始?简明Vim练级攻略, 英文原版在这里Learn Vim Progressively. 非常好的资料,介绍了vim最基础最常用的功能,就像文章说的, 先

电信网络拓扑图自动布局之总线

在前面<电信网络拓扑图自动布局>一文中,我们大体介绍了 HT for Web 电信网络拓扑图自动布局的相关知识,但是都没有深入地描述各种自动布局的用法,我们今天在这边就重点介绍总线的具体实现方案. 在 HT for Web 的连线手册中,有说明可以自定义连线类型,通过 ht.Default.setEdgeType(type, func, mutual) 函数定义,我们今天要描述的总线也是通过这样的方法来实现的. 我们来简单地描述下这个方法,虽然在文档(http://www.hightopo.c