28

以下の 2 つの SQL は同じ結果を取得します。

SELECT c.name, o.product  
FROM customer c, order o  
WHERE c.id = o.cust_id  
AND o.value = 150  

SELECT c.name, o.product  
FROM customer c  
INNER JOIN order o on c.id = o.cust_id  
WHERE o.value = 150

さまざまな会社で両方のスタイルが標準として使用されているのを見てきました。私が見た限りでは、オンラインで最も多くの人が推奨しているのは 2 番目です。スタイル以外にこれの本当の理由はありますか?内部結合を使用するとパフォーマンスが向上する場合がありますか?

Ingres と Oracle の開発者は最初のスタイルを使用する傾向があり、Microsoft SQL Server のユーザーは 2 番目のスタイルを使用する傾向があることに気付きましたが、それは単なる偶然かもしれません。

洞察をありがとう、私はしばらくこれについて疑問に思っていました。

編集: 間違った用語を使用していたため、タイトルを「SQL 内部結合とデカルト積」から変更しました。これまでのすべての応答に感謝します。

4

7 に答える 7

28

どちらのクエリも内部結合であり、同等です。1 つ目は古い方法ですが、JOIN 構文の使用は SQL-92 標準の導入後にのみ一般的になりました (古い定義にあると思いますが、それ以前は特に広く使用されていませんでした)。

結合ロジックを WHERE 句のフィルタリング ロジックから分離するため、JOIN 構文の使用が強く推奨されます。JOIN 構文は実際には内部結合のシンタックス シュガーですが、古い * 構文では結合を明確に記述できず、解釈が実装に依存する状況が発生する可能性がある外部結合に強みがあります。[左 | RIGHT] JOIN 構文はこれらの落とし穴を回避するため、一貫性を保つために、すべての状況で JOIN 句を使用することをお勧めします。

これら 2 つの例はどちらもデカルト積ではないことに注意してください。そのためには、どちらかを使用します

SELECT c.name, o.product  
FROM customer c, order o  
WHERE o.value = 150  

また

SELECT c.name, o.product  
FROM customer c  CROSS JOIN order o 
WHERE o.value = 150
于 2008-12-27T10:38:15.877 に答える
6

あなたの質問の一部に答えるために、Oracle の JOIN ... ON 構文の初期のバグが Oracle ユーザーをその構文から遠ざけたと思います。今のところ特に問題はないと思います。

これらは同等であり、最適化のために同じ内部表現に解析する必要があります。

于 2008-12-27T10:19:58.317 に答える
4

実際、これらの例は同等であり、どちらもデカルト積ではありません。次のように、結合条件を指定せずに 2 つのテーブルを結合すると、デカルト積が返されます。

select *
from t1,t2

ウィキペディアでこれについての良い議論があります。

于 2008-12-27T10:17:07.463 に答える
4

Oracle は JOIN ... ON (ANSI) 構文のサポートが遅れていました (Oracle 9 まで)。そのため、Oracle 開発者はこれを使用しないことがよくあります。

個人的には、1 つのテーブルがクエリを実行し、他のテーブルがルックアップ テーブルであることが論理的に明らかな場合は、ANSI 構文を使用することを好みます。テーブルが「等しい」場合、私はデカルト構文を使用する傾向があります。

パフォーマンスはまったく変わらないはずです。

于 2008-12-27T10:24:30.523 に答える
3

どちらのクエリも内部結合を実行していますが、構文が異なります。

于 2008-12-27T10:17:03.173 に答える
3

JOIN... ON... 構文は、SQL の ANSI および ISO 仕様に最近追加されたものです。JOIN... ON... 構文は、1) 結合条件を WHERE 句から移動して、フィルタリングのためだけに WHERE 句を作成し、2) 恐ろしいデカルト積を作成している場合にそれをより明確にするため、一般的に好まれます。 JOIN には、少なくとも 1 つの ON 句を指定する必要があります。すべての結合基準が WHERE 句で AND されているだけの場合、1 つ以上が欠落していることは明らかではありません。

于 2008-12-29T00:23:49.813 に答える