SQL语法:在join关联时,on和where的顺序和区别

2016/10/14 16:46
阅读数 2.1K

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

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

      对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。对于那些不影响选择行的条件,放在ON或者WHERE后面就可以。

记住:

  ON条件是在生成关联中间表过程中起到筛选作用,WHERE条件是对生成后的中间表进行筛选。

   所有的连接条件都必需要放在ON后面,,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。对于子表(被关联的表)的一些状态字段(如状态字段,有效性字段等)酌情考虑是否放在on条件后面,两种情况考虑:①不可以放在on条件里面:在on条件中加入子表独有的字段条件,有可能使得在生成中间表过程中出现只有主表,子表字段全是NULL的情况。此时,如果where语句中含有对子表字段的判断条件,由于中间表中子表的字段已经全是NULL了,且where操作的是生成后的中间表整体,加任何对子表段的判断条件最后查询的结果都是空(where 子表字段a  is null 除外)。②可以放在on条件里面:除了①提到的情况,把子表特有字段放在on条件后面,可以减少中间表关联次数,即缩小中间表结果集,从而提高查询效率。

 

展开阅读全文
打赏
0
1 收藏
分享

作者的其它热门文章

加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部