たとえば、テーブル「Worker」の列「id」を参照する列「id」を持つテーブル「Person」がある場合
これら2つのクエリの違いは何ですか?同じ結果が得られます。
SELECT *
FROM Person
JOIN Worker
ON Person.id = Worker.id;
そして
SELECT *
FROM Person,
Worker
WHERE Person.id = Worker.id;
ありがとう
違いはまったくありません。
2番目の表現により、クエリが読みやすくなり、どの結合がどの条件に対応するかが非常に明確になります。
クエリは論理的に同等です。コンマ演算子は、[INNER] JOIN
演算子と同等です。
コンマは、古いスタイルの結合演算子です。 JOINキーワードは後で追加され、OUTER結合操作も許可されるため好まれます。
また、結合述部(条件)をWHERE
句からON
句に分離することもできます。これにより、(人間の)読みやすさが向上します。
フォローアップ
この回答は、質問内の2つのクエリが同等であることを示しています。同じクエリ内で、結合操作用の旧式のコンマ構文と新しいJOIN
キーワード構文を混在させないでください。それらを混在させる場合、優先順位の違いに注意する必要があります。
mySQLリファレンスマニュアルからの抜粋
https://dev.mysql.com/doc/refman/5.6/en/join.html
INNER JOIN
と,
(コンマ)は、結合条件がない場合に意味的に同等です。両方とも、指定したテーブル間でデカルト積を生成します(つまり、最初のテーブルの各行がそれぞれに結合されます) 2番目のテーブルのすべての行)。ただし、コンマ演算子の優先順位は、
INNER JOIN
、CROSS JOIN
、LEFT JOIN
などの優先順位よりも低くなっています。結合条件があるときに他の結合タイプとコンマ結合を混在させると、Unknown column 'col_name' in 'on clause'
という形式のエラーが発生する場合があります。この問題への対処に関する情報は、このセクションで後述します。
読みやすさに加えて、コンマ区切りのテーブルではなく、明示的に結合されたテーブルの方が優れている場合がもう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番目のテーブルは最初のテーブルのテーブルエイリアスに自動的に変換されます。すべての場合ではありませんが、このような何かの可能性があります
JOINSを使用すると、一目瞭然なのでコードが読みやすくなります。
速度に違いはなく(テストしました)、実行計画は同じです
クエリオプティマイザーが適切に機能している場合、これらのクエリに違いはありません。同じ望ましい結果を指定するための2つの方法にすぎません。
The SELECT * FROM table1, table2, etc.
はいくつかのテーブルに適していますが、テーブルの数が増えると指数関数的に難しくなります。
JOIN
構文は、どの条件がどのテーブルに影響するかを明示的にします(条件を与える)。また、2番目の方法は古い標準です。
ただし、データベースにとっては、最終的には同じになります