join on where执行顺序

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

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

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

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

       假设有两张表:

表1:tab2

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中,返回的结果集是相同的。


区别:
on是对中间结果进行筛选,where是对最终结果筛选。
执行顺序:
先进行on的过滤, 而后才进行join。
效率:
如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: join on和where的执行顺序是先执行join on,再执行where。在执行join on时,会将两个表中符合条件的记录连接起来,形成一个新的表。然后在新的表中执行where条件,筛选出符合条件的记录。因此,join on和where的执行顺序是先连接表,再筛选记录。 ### 回答2: join on和where的执行顺序是不同的,具体的执行顺序取决于数据库引擎的实现。对于大多数数据库引擎来说,执行顺序可以通过查询计划来进行查看。 在简单的情况下,查询中的join on子句首先被执行,然后再执行where子句。join on子句用来连接两个或多个表,它根据指定的条件从不同的表中提取数据。这里的操作也被称为表连接操作。当join on子句执行之后,where子句对联接后的结果进行过滤,筛选满足where条件的数据。 但是,在更复杂的查询中,执行顺序是可能会不同的。一些数据库引擎会先执行where子句,过滤出一部分数据,然后进行join on操作。这是因为,where子句通常包含简单的过滤条件,可以通过索引来实现高效的查询。而join on操作更加复杂,需要读取多个表中的数据,进行复杂的匹配操作。 需要注意的是,在执行join on和where子句时,也需要考虑到查询中其他子句的影响。例如,group by子句和order by子句会对查询结果进行聚合和排序操作,也会影响查询的执行顺序。 总的来说,在编写查询语句时,应该尽量采用简单的语法和子句结构,避免过于复杂的嵌套和操作,以确保查询能够快速高效地执行。同时,也需要对数据库引擎的执行顺序有一定的了解,并进行优化和调整,以实现最佳的查询性能。 ### 回答3: 在SQL查询中,JOIN和WHERE是相当常见的两个部分,用于过滤数据和组合数据。JOIN是用于连接多个表格的机制,WHERE则是用于对这些表格中的数据进行过滤和筛选。JOIN和WHERE的执行顺序来影响查询的结果。在大多数情况下,JOIN会先执行,然后才是WHERE语句。 为了更好的理解JOIN和WHERE的执行顺序,以下是一个简单的例子:假设我们要查询两个表格(A和B),并且我们只需要A表格中的某些行以及A表格和B表之间的匹配行。我们的查询可能是这样的: ``` SELECT * FROM A JOIN B ON A.id = B.id WHERE A.name = 'John'; ``` 这个查询将返回所有与B表中匹配的A表格中的所有行,但只有其中那些包括名为 “John” 的行。JOIN语句根据表格A和B之间的连接条件来组合两个表格中的行,这是在WHERE语句之前完成的。一旦行被连接起来,WHERE语句会对它们进行过滤,只保留具有指定名称的行。实际上,如果我们在该查询中删除了WHERE语句,只有连接的行将被返回。 在某些情况下,JOIN和WHERE语句的执行顺序会产生更大的影响。例子:如果对表格A进行过滤需要查找的是包含John名字的行。但如果我们想要过滤的是与B表之间匹配的行,则执行JOIN操作后应该使用WHERE 条件,否则JOIN操作中多余的行就可能增加查询时间。 总的来说,JOIN是先执行的,然后才是WHERE语句。JOIN在执行查询时根据连接条件来合并表格,从而创建一个虚拟表格,查询结果就是该表格中的所有行。然后查询引擎对该表格应用WHERE语句,以确定最终返回的结果集。因此,正确的执行顺序将确保优化查询并减少查询时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值