select * from StudySQL.dbo.id_name n
inner join StudySQL.dbo.id_sex s
on n.id=s.id
and s.sex='f'
select * from StudySQL.dbo.id_name n
inner join StudySQL.dbo.id_sex s
on n.id=s.id
where s.sex='f'
Run Code Online (Sandbox Code Playgroud)
结果是一样的.那么他们之间有什么区别?
我做了几个有趣的尝试.
select * from StudySQL.dbo.id_name n
1 | baby
3 | alice
select * from StudySQL.dbo.id_class c
1 | math
3 | physics
3 | english
4 | chinese
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name='alice'
name id id class
baby 1 NULL NULL
alice 3 1 math
alice 3 3 physics
alice 3 3 english
alice 3 4 chinese
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name='baby'
name id id class
baby 1 1 math
baby 1 3 physics
baby 1 3 english
baby 1 4 chinese
alice 3 NULL NULL
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name<>''
name id id class
baby 1 1 math
baby 1 3 physics
baby 1 3 english
baby 1 4 chinese
alice 3 1 math
alice 3 3 physics
alice 3 3 english
alice 3 4 chinese
Run Code Online (Sandbox Code Playgroud)
所以我认为,可以合理地说,on子句决定应该连接哪些行.而where子句决定应返回哪些行.
如果这是真的,我认为最好在on子句中编写详细的限制,以便需要连接更少的行.因为加入是一项昂贵的操作.
虽然这是一个没有区别,INNER JOIN但如果您使用的话,结果会有很大不同OUTER JOIN.与LEFT OUTER JOIN第二个查询一起使用会隐式变为INNER JOIN.
通过使用AND谓词来识别s中的行何时应该连接到n.在内连接中,这里的否定结果将防止省略n和s侧.