1
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'

結果は同じです。それで、それらの間に何か違いはありますか?

追加

私はさらにいくつかの興味深い試みをしました。

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   

だから私は言うのが合理的だと思います、on節はどの行を結合するかを決定します。where句は、返される行を決定します。

これが本当なら、結合する必要のある行が少なくなるように、on句に詳細な制限を記述したほうがよいと思います。結合はコストのかかる操作であるためです。

4

4 に答える 4

9

これは違いはありませんINNER JOINが、を使用した場合の結果は大きく異なりますOUTER JOIN。2番目のクエリで使用すると、LEFT OUTER JOIN暗黙的に。になりますINNER JOIN

述語を使用ANDすることにより、sからの行をnに結合するタイミングを識別できます。内部結合では、ここで負の結果になると、n側とs側の両方が省略されなくなります。

于 2012-05-24T14:50:05.950 に答える
2

ON句はテーブル間の関係を指定するためのものであり、WHERE句はフィルター条件を指定するためのものです。この場合の結果/パフォーマンスの問題というよりは、概念的な問題かもしれません。

于 2012-05-24T14:59:54.253 に答える
2

このトピックに関するいくつかの興味深い議論はここにあります:

INNER JOIN ONvsWHERE句

これらは常に同じ結果を返す必要がありますが、フィルタリングされた行が削除されるときのために、クエリプランとパフォーマンスがわずかに異なる可能性があります。この動作は、使用しているサーバーによって異なります。

于 2012-05-24T15:10:10.223 に答える
1

Marc Romeroが言ったように、ON句はテーブル間の関係を指定することであり、WHERE句はフィルター条件を指定することです。この特定のクエリでは、同じ結果が表示されますが、他のクエリでは、違いを理解していないと、予期しない結果が得られる可能性があります。以下のクエリ(INNERではなくLEFT JOINSを使用したもの)を検討してください。

SELECT *
FROM StudySQL.dbo.id_name n
LEFT JOIN StudySQL.dbo.id_sex s ON n.id=s.id AND s.sex='f'

SELECT *
FROM StudySQL.dbo.id_name n
LEFT JOIN StudySQL.dbo.id_sex s on n.id=s.id
WHERE s.sex='f'

1つ目は、StudySQL.dbo.id_nameからの情報と、性別が「f」のレコードに関連付けられたStudySQL.dbo.id_sexテーブルからの情報を返します。2番目はすべての名前を返しますが、性別が「f」の名前のみにStudySQL.dbo.id_sexからの情報が入力されます。

于 2012-05-24T15:49:58.710 に答える