这两个sql命令有什么区别?

smw*_*dia 1 sql

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子句中编写详细的限制,以便需要连接更少的行.因为加入是一项昂贵的操作.

Dan*_*haw 9

虽然这是一个没有区别,INNER JOIN但如果您使用的话,结果会有很大不同OUTER JOIN.与LEFT OUTER JOIN第二个查询一起使用会隐式变为INNER JOIN.

通过使用AND谓词来识别s中的行何时应该连接到n.在内连接中,这里的否定结果将防止省略n和s侧.