web-dev-qa-db-ja.com

SQLはベン図として結合します

私はSQLの結合を理解するのに苦労しており、私が私を助けるかもしれないと思うこのイメージに出くわしました。問題は、私が完全に理解していないことです。たとえば、画像の右上隅にある結合は、Bの円全体を赤に着色しますが、Aからのオーバーラップのみを示します。それ自体は、A(Aから選択、Bに参加)で始まることで、反対の印象を与えます。つまり、Aがsqlステートメントの焦点になるということです。

同様に、下の画像にはBサークルからのデータのみが含まれているのに、なぜAはjoinステートメントに含まれているのですか?

質問:右上から時計回りに作業し、中央で終了すると、誰かが各sqlイメージの表現に関する詳細情報を提供して、説明することができます

a)それぞれの場合に結合が必要な理由(たとえば、特にAまたはBからデータが取得されない場合、つまりAまたはBのみがカラーリングされる場合)

b)および画像がsqlの適切な表現である理由を明確にするその他の詳細

sql join diagram

41

主な根本的な混乱は、(たとえば)Aのみが赤で強調表示されている場合、「クエリはAからのデータのみを返す」という意味だと思います」ですが、実際には「Aにレコードがある場合にのみ、クエリはデータのみを返します」を意味します。クエリにはまだBからのデータが含まれている可能性があります(Bnotにレコードがない場合、クエリはNULLに置き換えられます。)

同様に、下の画像にはBサークルからのデータのみが含まれているのに、なぜAはjoinステートメントに含まれているのですか?

つまり、Aが完全に白であり、Bの部分にAと重ならない赤い三日月形の画像がある場合、その理由: Aはクエリに表示され、Aは除外する必要があるBのレコードを検索する方法です。 (Aがクエリに表示されなかった場合、ベン図にはAが含まれず、Bのみが表示され、目的のレコードを区別する方法はありません。不要なものから。)

画像は、円Bがsqlステートメントの主な焦点のように見えますが、sqlステートメント自体は、A(Aから選択、Bに参加)で始まることで、反対の印象を伝えます。つまり、Aがフォーカスになるということです。 sqlステートメントの。

まったく正しい。このため、_RIGHT JOIN_ sは比較的一般的ではありません。 _LEFT JOIN_を使用するクエリは、ほとんどの場合、代わりに_RIGHT JOIN_を使用するように並べ替えることができます(逆も同様です)が、通常、人々は_LEFT JOIN_を使用してクエリを作成し、_RIGHT JOIN_。

8
ruakh

ここで、ベン図の制限についてケイドに同意します。より適切な視覚的表現はこれかもしれません。

テーブル

Tables

SELECT A.Colour、B.Colfrom FROM A CROSS JOIN B SQL Fiddle

クロス結合(またはデカルト積)は、2つのテーブルの行のすべての組み合わせで結果を生成します。各テーブルには4行あるため、結果には16行が生成されます。

Cross Join

SELECT A.Colour、B.Colour from A inner JOIN B ON A.Colour = B.Colour SQL Fiddle

内部結合は、結合条件に一致するすべての行をクロス結合から論理的に返します。この場合、5人が行います。

Inner Join

SELECT A.Colour、B.Colour from A inner JOIN B ON A.Colour NOT IN( 'Green'、 'Blue') SQL Fiddle

内部結合条件は必ずしも等価条件である必要はなく、両方のテーブル(またはいずれか)の列を参照する必要はありません。クロスジョインの各行でA.Colour NOT IN ('Green','Blue')を評価すると戻ります。

inner 2

1=1の内部結合条件は、相互結合のすべての行でtrueと評価されるため、2つは同等です( SQL Fiddle )。

SELECT A.Colour、B.Colour from A LEFT OUTER JOIN B. A.Colour = B.Colour SQL Fiddle

外部結合は、内部結合と同じ方法で論理的に評価されますが、左テーブルの行(左結合の場合)が右テーブルの行とまったく結合しない場合は、NULL右側の列の値。

LOJ

SELECT A.Colour、B.Colour from A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL SQL Fiddle

これは、B.Colour IS NULLの行のみを返すように前の結果を単に制限します。この特定の場合、これらは右側のテーブルに一致しないため保存された行になり、クエリはテーブルBに一致しない単一の赤い行を返します。これは反準結合として知られています。

IS NULLテスト用の列を選択することが重要です。この列は、nullを許可しないか、結合条件によってNULL値が除外され、このパターンが正しく機能し、一致しない行に加えて、その列のNULL値を持つ行を戻す。

loj is null

A.Colour = B.Colour SQL Fiddle の右側の外部結合BからA.Colour、B.Colourを選択します

右側の外部結合は、右側のテーブルの一致しない行を保持し、左側の列をnull拡張することを除き、左側の外部結合と同様に機能します。

ROJ

A.Colour = B.Colour SQL Fiddle の完全な外部結合BからA.Colour、B.Colourを選択します

完全外部結合は、左結合と右結合の動作を組み合わせて、左テーブルと右テーブルの両方から一致しない行を保持します。

FOJ

52
Martin Smith

ベン図は、UNION、INTERSECTS、EXCEPTなどの集合演算を表すのに適しています。

EXCEPTのようなセット操作が、LEF JOIN WHERE rhs.KEYがNULLのようなものでシミュレートされる限り、この図は正確です。

それ以外の場合は誤解を招きます。たとえば、結合条件が1:1でない場合、結合によって行が増加する可能性があります。ただし、セットには個別のメンバーのみを含めることができるため、それらをセット操作として表すことはできません。

次に、CROSS JOINまたはINNER JOIN ON 1 = 1があります。これは、この図に示されているINNER JOINに類似しておらず、生成されるセットを実際にベン図で記述することもできません。他のすべての三角形の結合、自己結合、反結合などは言うまでもありません:

lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)

または

SELF self1
INNER JOIN SELF self2
    ON self2.key <> self1.key
    AND self1.type = self2.type

(自分自身と自分以外の類似した家族をすべて見つけるための反結合-self1とself2は同じセットであり、結果は適切なサブセットです)

キーの結合に固執することは、チュートリアルの最初の数分間は問題ない場合がありますが、これは結合が何であるかを学習するための不十分なパスにつながる可能性があります。これがあなたが見つけたものだと思います。

ベン図は一般的にこの方法でJOINを表すことができるというこの考え方は廃止する必要があります。

10
Cade Roux