#前言

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

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

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

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

#实验  

  #假设有两张表:

  表1:tab1

id
age
1
10
2
20
3
30

  

  表2:tab2

age
name
10
张三
20
李四
20
王五

  #两条SQL:

--1、where 条件筛选
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’张三’
--2、on条件筛选
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’张三’)

第一条SQL的过程:

1、中间表
on条件: 
tab1.age = tab2.age
tab1.id tab1.age tab2.age tab2.name
1
10
10
张三
2
20
20
李四
2
20
20
王五
3
30
(null)
(null)
↓↓↓
↓↓↓

2、再对中间表过滤
where 条件:
tab2.name=’AAA’

tab1.id tab1.age tab2.age tab2.name
1
10
10
张三
   

第二条SQL的过程:

1、中间表
on条件: 
tab1.age = tab2.age and tab2.name=’张三’
(条件不为真也会返回左表中的记录,相当于先对tab2按照on条件tab2.name='张三' 进行筛选,然后再与tab1进行join)
tab1.id tab1.age tab2.age tab2.name
1
10
10
张三
2
20
(null)
(null)
3
30
(null)
(null)

#总结:

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

参考: https://www.cnblogs.com/sky6699/p/5238584.html

最新文章

  1. Tower是个不错的项目管理开放平台
  2. jcmd、jmc介绍
  3. sql 在not in 子查询有null值情况下经常出现的陷阱
  4. jquery ajax error函数详解
  5. A星寻路算法
  6. hdu 1162 Eddy's picture(最小生成树,基础)
  7. mac下设置maven环境
  8. 分享下VellLock源代码。。。VellLock正式开源
  9. PostgreSQL9.5 新特性
  10. 字符串(AC自动机):COCI 2015 round 5 divljak
  11. TCP/IP协议原理与应用笔记08:对等层和对等实体
  12. css+javascript 写的HTML5 微信端输入支付密码键盘
  13. thinkpad yoga 12 / thinkpad s1 yoga / WS860
  14. lua 中 socket 通信示例
  15. 利用STM32CubeMX之SPI
  16. tornado.ioloop.IOLoop相关文章
  17. linux/Mac使用du查看目录占用的磁盘大小
  18. Java 8学习之Lambda表达式
  19. 我们一起学习WCF 第八篇回调函数
  20. db2快照

热门文章

  1. Codeforces Round #437 Div. 1
  2. Linux服务器下安装vmware虚拟机
  3. HDU1505 City Game(算竞进阶习题)
  4. Escape HDU - 3605(归类建边)
  5. 白兔的刁难 IDFT
  6. Django media 配置
  7. thinkPHP框架5.0 类图下载
  8. docker 创建私有仓库
  9. 「SCOI2014」方伯伯的玉米田 解题报告
  10. BZOJ3566: [SHOI2014]概率充电器 树形+概率dp