数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1:tab2
表格2
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
ab1.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’
ab1.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中,返回的结果集是相同的
分享到:
相关推荐
SQL中on条件与where条件的区别基础知识
本文简单描述了sql语句join中on和where的区别以及其原理
left_join_on_and与left_join_on_where的区别
sql查询左连接on与where的区别(2).pdf
1.SQL SERVER Always On收缩日志文件详细操作; 2.针对收缩日志出现“cannot be shrunk until all secondaries have moved past the point where the log was added ”问题的分析及解决方法;
主要给大家介绍了关于SQL中过滤条件放on和where中的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
1、 on条件是在成临时表时使的条件,它不管on中的条件是否为真,都 2、where条件是在临时表成好后,再对临时表进过滤的条件 1、中间表 2、再对中间表过滤
主要介绍了SQL where条件和jion on条件的详解及区别的相关资料,这里举例说明该如何区分,需要的朋友可以参考下
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。这篇文章主要介绍了sql中的left join以及on、where关键字的区别,需要的朋友可以参考下
另人迷惑首当其冲的要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢...
接触Sql语句时间挺长时间了,听他人说过sql语句的连接查询,...下面这篇文章主要给大家介绍了关于sql连接查询语句中on、where筛选两者之间区别的相关资料,文中通过图文介绍的非常详细,需要的朋友们下面来一起看看吧。
以下是对在sql语句中left_join、inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下
问题是常规的写法,将 day >= xxx 条件放到 where 中, 如果某些数据近一周没有访问量,那么这条数据就查不出来。解决办法呢,就是将条件放到 LEFT JOIN 中。 MySQL 语句执行顺序 首先先说明一个概念,MySQL 语句...
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 说明:两张关联表...
通过上面的例子已经很清晰的表明了,在执行动态SQL 语句的时候,EXEC 和 SP_EXECUTESQL 的区别了,来总结一下: 1、 性能: 官方描述:sp_executesql stmt 参数中的 Transact-SQL 语句或批处理在执行 sp_execute...
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...
它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。...