2011-11-24 10 views
5

SQL 1:select * from t1 join t2 on t1.f1 = t2.f22つのSQL結合表記の違いは何ですか?

SQL 2:select * from t1,t2 where t1.f1 = t2.f2

結果、彼らは返すことは同じです。彼らの間に違いはありますか?たとえば、DBMSがどのようにそれらを実行するか、またはクエリプランで?

+5

http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

答えて

11

2つのクエリには動作上の違いはありません。

ただし、明示的な結合表記法は、学習して使用するためのより優れたスタイルです。他のコードを(まだ変更されていない)レガシーコードのままにしておきます。

+1

あなたのedit.myに感謝します。英語は十分ではありません。 – SleeplessKnight

6

1つは古いスタイルで、もう1つは新しい(ANSI)スタイルです。新しいスタイルを使用する理由がわかっている主な理由は、外部結合の標準的なサポートです。古いスタイルでは、外部結合はベンダー固有です。新しいスタイルは、標準のそれを持っている:

select * from t1 left outer join t2 on t1.f1 = t2.f2 

あなたの例では、SQL 1は、新規およびSQL 2ところで、古いスタイルです。

+0

"古いスタイル"と "新しいスタイル"のどちらを表示したいでしょうか。 –

+0

良い点。 –

+0

を更新すると、ベンダー固有の意味は異なるSQL製品(sqlserverとoracleなど)に依存していますか? – SleeplessKnight

1

基本的に、操作中の2つのクエリには違いはありません。

しかし、どちらも同じ実行計画を持ち、両方のクエリが同じ時間(同じパフォーマンス)で実行されることを意味する同じコストです。

結合演算子の使用は現代的な方法です。

1

2つは意味的に同等です(テーマの他のバリエーションの中でも)。 1つの違いは、Stackoverflow上の多くのユーザーが、「古いスタイル」の内部結合(SQL 2)に耐性がないことを表現することで、非常にボーカルであり、投稿する人は誰でもコメントに注意を喚起するだけでなく、あなたはまた、アンチ・パターンが適用されていることに気付くでしょう。これはナンセンスです。私はSOコミュニティの外でこのスタイル不耐性に遭遇したことはありません。実際、SQL文章では、「古いスタイル」の内部結合が非常に一般的です。

+0

しばらくの間、SO SQLタグで活動している誰もが[参照](http://stackoverflow.com/q/7442344)[lots](http://stackoverflow.com/q/3056271)[明示的な 'JOIN'構文で回避されていた不注意なデカルト結合の例(http://stackoverflow.com/q/7330433)[examples](http://stackoverflow.com/q/6156757) –

+0

@MartinSmith:あなたのロジックに欠陥があります:私はしばらくの間、SO SQLタグで活動してきましたが、このスタイルに不耐性を発達させていませんでした;)むしろ心理的な理由から開発したと思います。 「SELECT *」と「NATURAL JOIN」と並行して、「Bad things happen if happen ...」の行に沿って並び替えることができます。 – onedaywhen

関連する問題