2013-11-22 9 views
57

たとえば、「Worker」テーブルの列「id」を参照する列「id」を持つ「Person」テーブルがある場合MySQLのコンマ区切り結合と結合構文の違いは何ですか?

これらの2つのクエリの違いは何ですか?それらは同じ結果をもたらす。

SELECT * 
FROM Person 
JOIN Worker 
    ON Person.id = Worker.id; 

SELECT * 
FROM Person, 
    Worker 
WHERE Person.id = Worker.id; 

おかげ

答えて

29

には全く違いはありません。

2番目の表現はクエリをより読みやすくし、どの結合がどの条件に対応するかを非常に明確にします。

+0

パフォーマンスの違いはありますか? PostgreSQLではいかがですか? – Liam

+1

パフォーマンスには全く違いはありません。 SQL Serverによって準備された最終版は、両方の場合で同じになります。 – DarkKnight

+26

大規模なクエリの場合、最初の方法は読みやすくなっています。ミックス・レフト・ジョインといくつかのインナー・ジョインがある場合は、ジョインの条件や、where句のジョイン条件よりも、ジョイン条件がより一貫しています。 –

2

使用することは自明なので、読みコードが容易になり加わります。

はスピードに違いはありません(私はそれをテストした)と、実行計画は、クエリオプティマイザがその仕事の権利をやっている場合は、これらのクエリに違いはありません同じ

です。同じ目的の結果を指定するには、2つの方法に過ぎません。

13

クエリは論理的に同等です。カンマ演算子は[INNER] JOIN演算子に相当します。

コンマは、古いスタイルの結合演算子です。 JOINキーワードは後で追加され、OUTER結合操作も可能であるため、好意的です。

また、結合述部(条件)をWHERE句からON句に区切ることができます。これにより、(人間の)可読性が向上します。

2

The SELECT * FROM table1, table2, etc.は2つのテーブルに適していますが、テーブルの数が増えると指数関数的に大きくなります。

JOIN構文は、どの条件がどのテーブルに影響するかを明示します(条件を与えます)。また、2番目の方法は古い標準です。

は、データベースが、にそれらが読みやすく横に同じ

+2

指数関数的に難しいですか?どうやって?誰のために? – Gal

10

である結局、明示的に接合されたテーブルはカンマで区切られたテーブルのよりよい代わりである1つ以上の場合もあります。

Create Table table1 
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY , 
    Name varchar(50) 
) 

Create Table table2 
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY , 
    ID_Table1 INT NOT NULL 
) 

次のクエリは

SELECT 
    * 
FROM table1, table2 

次のクエリは、私のテーブルの別名を持つ最初のテーブルから列を与える両方のテーブルから私にすべての列と行を与えるだろう「表2と呼ばれる:

のは例を見てみましょう'

SELECT 
    * 
FROM table1 table2 

誤ってコンマ区切りのカンマでカンマを忘れた場合は、2番目のta bleは自動的に最初のテーブルのテーブルエイリアスに変換されます。すべての場合ではありませんが、このようなものの可能性があります

関連する問題