mssql sqlserver sql脚本中on和where后的区别


摘要:
下文讲述sql脚本中 on where的使用区别,
实验环境:sqlserver 2008

sqlserver 连接两张或多张表时,sql引擎将连接后的结果生成临时表,然后输出给用户,下文讲述各种连接中,on和where关键字的用法区别,如下:

例: select * from A left join B on …
1 on 条件,无论条件是否成立, 都会返回A表的记录,并生成相应的临时表
2 where 条件,on 条件生成临时表后,然后再对临时表执行where过滤操作,where条件不为真时,则剔除掉。

例:
表A:A

keyId

info
1

10
2

20
3

30
表B:B
keyId

name
1

测试
1

测试B
20

测试C

————————-
语句1: select * form A left join B on (A.keyId = B.keyId) where B.name=’测试’
语句2:select * form A left join B on (A.keyId = B.keyId and B.name=’测试B’)
————————
第一条SQL的过程:
1、中间表 on条件: A.keyId = B.keyId

A.keyId

A.info

B.keyId

B.name
1

10

1

测试
1

10

1

测试B

2
20

null

null

3
30

null

null

2、再对中间表过滤 where 条件: B.name=’测试’

A.keyId

A.info

B.keyId

B.name
1

10

10

AAA

————————
第二条SQL的过程:

1、中间表 on条件: A.keyId = B.keyId nd B.name=’测试’ (条件不为真也会返回左表中的记录)

A.keyId

A.info

B.keyId

B.name
1

10

1

测试

—————————————
on where 关键字:
on关键字其表连接作用,where对生成后的表进行过滤。
left join :返回左表所有记录,将满足on条件的记录进行连接,返回左表全部字段,右表无连接字段时,返回右表null
right join :返回右表所有记录,将满足on条件的记录进行连接,返回右表全部字段,左表无连接字段时,返回左表null
inner join:同where 功能一致