网站首页> 博客> left join加上where条件的困惑 --SQL优化

left join加上where条件的困惑 --SQL优化

好文 1713
张世烩
张世烩 2017-04-05
收藏

left join加上where条件的困惑

摘自:http://hi.baidu.com/dyzhong/blog/item/b42e56a93c0bfcf71e17a2c0.html

left join的困惑:一旦加上where条件,则显示的结果等于inner join

将where 换成 and

用where 是先连接然后再筛选 
用and 是先筛选再连接

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

  在使用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或r
  • 没有任何评论
个评论
张世烩

张世烩 (白银)

1152金币 (29)粉丝 (34)源码

一切皆有可能!!!!

 

加入微信群,不定期分享源码和经验
签到活跃榜 连续签到送额外金币
最新博客
校园跑腿系统外卖系统软件平台大学生创业平台搭建 1211
壹脉销客智能名片CRM系统小程序可二开源码交付部署 1265
为啥没搞了 1861
Nginx 的 5 大应用场景,太实用了! 2019
CentOS 8-stream 安装Postgresql 详细教程 2333
JAVA智慧校园管理系统小程序源码 电子班牌 Sass 模式 1769
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 1537
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 1499
致远OA权限 2443
发博客会有金币吗 1577