この質問は、さまざまなひねりを加えて何度も行われていると思います。しかし、このトピックの一般的で包括的な理解を得たいと思います。(それはプログラミングSOに属しますか?..)
のテーブルsports
とのテーブルがあるとしましょうmatches
。matches
、他のフィールドの中でsport_id
列があり、これは1対多の関係です。
X日目に試合があるスポーツをリストアップしたいとしましょう。これは、考えられる3つの方法で行うことができます。
ネストされたクエリ-推論するのは簡単ですか?
SELECT *
FROM sports
WHERE id IN (SELECT sport_id FROM matches WHERE <DATE CHECK>)
どこから/どこから-書くのは簡単ですか?
SELECT sports.*
FROM sports, matches
WHERE sports.id = matches.sport_id
AND <DATE CHECK>
参加-私はあまり馴染みがないので、間違いを許してください
SELECT *
FROM sports
JOIN matches ON sports.id = matches.sport_id
WHERE <DATE CHECK>
結合のバリエーションに基づく他の方法があり、ここでより適している可能性があります。おそらく内部結合です。
私が知りたいのは、これら3つをに基づいて比較する方法です。
2番目と3番目の形式は完全に同等です(3番目のバージョンに余分なコンマがあることを除いて)。FROM sports, matches
は暗黙的な結合でFROM sports JOIN matches
あり、は明示的な結合です。暗黙的結合は以前の形式であり、明示的結合はより現代的であり、データベースの専門家によって一般的に好まれています。
のバージョンWHERE IN
はほぼ同じですが、いくつかの違いがあります。まず、SELECT *
結合で両方のテーブルから列を返しますsports
が、WHERE IN
クエリではからの列のみを返します。次に、の行がのsports
複数の行と一致する場合matches
、結合は一致のペアごとに行を返します(クロス積を実行します)が、一致の数に関係なく、1回WHERE IN
から行を返しsports
ます。
パフォーマンスの違いは実装によって異なります。明示的結合と暗黙的結合の間に違いはないはずです。これらは単なる構文糖衣です。ただし、データベースは常にWHERE IN
クエリを同じように最適化するとは限りません。たとえば、EXPLAIN
MySQLを使用した場合WHERE IN
、サブクエリが返す行数が少ない場合でも、クエリは外部テーブルに対してフルスキャンを実行し、サブクエリ内のテーブルのインデックスと列を照合することがよくあります。最近のMySQLバージョンの方がこれが優れていると言う人もいると思います。
それらはすべて1回のネットワーク通話になります。すべてのクエリは、データベースサーバーへの1回の呼び出しです。
ところで、WHERE EXISTS
相関サブクエリで使用して、リストしなかった別のフォームがあります。
SELECT *
FROM sports s
WHERE EXISTS (SELECT 1
FROM matches m
WHERE s.id = m.sport_id AND <DATE CHECK>)
これとの間のパフォーマンスの違いは、JOIN
やはり実装に依存します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加