web-dev-qa-db-ja.com

MySQLのカンマ区切りの結合と構文の結合の違いは何ですか?

たとえば、テーブル「Worker」の列「id」を参照する列「id」を持つテーブル「Person」がある場合

これら2つのクエリの違いは何ですか?同じ結果が得られます。

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

そして

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

ありがとう

83
Big Money

違いはまったくありません

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

48
sateesh

クエリは論理的に同等です。コンマ演算子は、[INNER] JOIN演算子と同等です。

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

また、結合述部(条件)をWHERE句からON句に分離することもできます。これにより、(人間の)読みやすさが向上します。


フォローアップ

この回答は、質問内の2つのクエリが同等であることを示しています。同じクエリ内で、結合操作用の旧式のコンマ構文と新しいJOINキーワード構文を混在させないでください。それらを混在させる場合、優先順位の違いに注意する必要があります。

mySQLリファレンスマニュアルからの抜粋

https://dev.mysql.com/doc/refman/5.6/en/join.html

INNER JOIN,(コンマ)は、結合条件がない場合に意味的に同等です。両方とも、指定したテーブル間でデカルト積を生成します(つまり、最初のテーブルの各行がそれぞれに結合されます) 2番目のテーブルのすべての行)。

ただし、コンマ演算子の優先順位は、INNER JOINCROSS JOINLEFT JOINなどの優先順位よりも低くなっています。結合条件があるときに他の結合タイプとコンマ結合を混在させると、Unknown column 'col_name' in 'on clause'という形式のエラーが発生する場合があります。この問題への対処に関する情報は、このセクションで後述します。

31
spencer7593

読みやすさに加えて、コンマ区切りのテーブルではなく、明示的に結合されたテーブルの方が優れている場合がもう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

次のクエリは、「table2」というテーブルエイリアスを持つ最初のテーブルの列を提供します

SELECT
    *
FROM table1 table2

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

12
veljasije

JOINSを使用すると、一目瞭然なのでコードが読みやすくなります。

速度に違いはなく(テストしました)、実行計画は同じです

クエリオプティマイザーが適切に機能している場合、これらのクエリに違いはありません。同じ望ましい結果を指定するための2つの方法にすぎません。

3
vhadalgi

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

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

ただし、データベースにとっては、最終的には同じになります

2