左、右、外部、内部結合の違いは何ですか?


562

これらすべての異なる結合をどのように区別するのか不思議に思っています...


60
コーディングホラーよりSQL結合の視覚的説明
SQLMenace 2009年

3
また、記事では何もしませんが、おそらく完全には理解していない誰かがそれに参加するためにはかなり明確であることをあなたのような誰かのために、ご理解のあなたのレベルに依存
SQLMenace


1
これは私に大いに役立ちました...最も簡単な方法は、テストテーブルを作成して、それらで遊ぶことです。= P
daGrevis

回答:


797

簡単な例StudentsテーブルとテーブルがあるとしLockersます。SQLでは、結合で指定する最初のテーブルStudentsLEFTテーブルで、2番目のテーブルLockersRIGHTテーブルです。

各学生をロッカーに割り当てることができるためLockerNumberStudentテーブルに列があります。1人のロッカーに複数の学生がいる可能性がありますが、特に学年の初めに、ロッカーのない新入生と、学生が割り当てられていないロッカーがいる場合があります。

この例のために、100人の学生がいて、そのうち70 がロッカーを持っているとします。ロッカーは合計50台あり、そのうち40台には少なくとも1人の学生がいて、10台のロッカーには学生がいません。

INNER JOINは、「すべての学生にロッカーを見せて」と同等です。
ロッカーのない学生、または学生のないロッカーがありません。
70行を返します

LEFT OUTER JOINは、「すべての学生に、対応するロッカーがある場合は、それにロッカーを見せてください」です。
これは一般的な学生のリストであるか、ロッカーのない学生を識別するために使用できます。
100行を返します

RIGHT OUTER JOINは、「すべてのロッカーと、割り当てられている学生がいる場合は、それらに割り当てられている学生を見せて」です。
これは、学生が割り当てられていないロッカーや、学生が多すぎるロッカーを識別するために使用できます。
80行を返します(40ロッカーの70人の学生のリストに加えて、学生のいない10個のロッカー)

FULL OUTER JOINはばかげて、おそらくあまり使用されません。
すべての生徒とすべてのロッカーを見せて、できる限り一致させる」のようなもの
110行を返します(ロッカーなしの生徒も含めて100人の生徒全員。プラス生徒のいない10個のロッカー)

CROSS JOINもこのシナリオではかなりばかげています。
これはlockernumber、studentsテーブルのリンクされたフィールドを使用しないため、基本的に、実際に存在するかどうかに関係なく、可能なすべての学生とロッカーのペアの大きな巨大なリストになります。
5000行を返します(100人の学生x 50個のロッカー)。新入生と空のロッカーを一致させるための出発点として(フィルタリングを使用して)役立ちます。


12
この例を使用すると、CROSS結合はロッカー割り当てを作成するための開始点として役立ちます。可能なすべての組み合わせから始めて、他の基準を使用してリストから結果をフィルタリングします。
Joel Coehoorn、2009年

1
いい答えだ。クロス結合は、多数のレコードが必要な場合に、数行からテストデータを生成するために最もよく使用されると思います。
Eli

6
FULL OUTER JOINSは、孤立したデータを検索する場合、または同じデータセットの異なるバージョンを比較する場合に役立ちます。
Lara Dougan、

3
デカルト積とも呼ばれるクロスジョイン
JavaRocky 2010

3
クエリの開始方法は、結合タイプの結果に影響を与えると思います。たとえば、SELECT * FROM students RIGHT OUTER JOIN lockers...とは異なる結果になりSELECT * FROM lockers RIGHT OUTER JOIN students...ます。すばらしい回答ですが、完全なSQLクエリで更新されることを
望んでいます

141

結合には3つの基本的なタイプがあります。

  • INNERjoinは2つのテーブルを比較し、一致する結果のみを返します。最初のテーブルのレコードは、2番目の複数の結果と一致する場合に複製されます。INNER結合は結果セットを小さくする傾向がありますが、レコードを複製できるため、これは保証されません。
  • CROSSjoinは2つのテーブルを比較し、両方のテーブルから行の可能なすべての組み合わせを返します。この種類の結合からは意味のない結果が多数得られる可能性があるため、注意して使用してください。
  • OUTERjoinは2つのテーブルを比較し、一致が利用可能な場合はデータを返し、そうでない場合はNULL値を返します。INNER結合の場合と同様に、これは、他のテーブルの複数のレコードと一致する場合に、1つのテーブルの行を複製します。OUTER結合は、それ自体ではレコードをセットから削除しないため、結果セットが大きくなる傾向があります。NULL値を追加する時期と場所を決定するには、OUTER結合を修飾する必要もあります。
    • LEFT つまり、最初のテーブルのすべてのレコードを保持し、2番目のテーブルが一致しない場合はNULL値を挿入します。
    • RIGHT 反対を意味します。何があっても2番目のテーブルのすべてのレコードを保持し、1番目のテーブルが一致しない場合はNULL値を挿入します。
    • FULL は、両方のテーブルのすべてのレコードを保持し、一致しない場合はどちらかのテーブルにNULL値を挿入することを意味します。

多くの場合OUTER、構文から省略されたキーワードが表示されます。代わりに、「LEFT JOIN」、「RIGHT JOIN」、または「FULL JOIN」になります。これは、INNERおよびCROSS結合がLEFT、RIGHT、またはFULLに関して意味を持たないために行われ、これらはそれ自体でOUTER結合を明確に示すのに十分です。

次に、各タイプを使用する場合の例を示します。

  • INNER:「Invoice」テーブルのすべてのレコードを、対応する「InvoiceLines」とともに返したいとします。これは、すべての有効な請求書に少なくとも1つの行があることを前提としています。
  • OUTER:特定の請求書のすべての「InvoiceLines」レコードと、対応する「InventoryItem」レコードを返す必要があります。これはサービスも販売するビジネスであり、すべてのInvoiceLineにIventoryItemがあるわけではありません。
  • CROSS:10行の数字テーブルがあり、それぞれに値「0」から「9」が保持されています。結合する日付範囲テーブルを作成して、範囲内の1日ごとに1つのレコードになるようにします。このテーブル自体を繰り返しCROSS結合することにより、必要な数の連続した整数を作成できます(10の1乗で開始すると、各結合は指数に1を追加します)。次に、DATEADD()関数を使用して、これらの値を範囲の基準日に追加します。

1
いいね。通常、 'JOIN'とだけ書いた場合は、INNER JOINを追加するだけです。
matpop

47

4種類しかない:

  1. 内部結合:最も一般的なタイプ。結合条件に一致する入力行のすべてのペアに対して出力行が生成されます。
  2. 左外部結合:内部結合と同じですが、右側のテーブルに一致する行が見つからない行がある場合、左側のテーブルの値を含む行が出力さNULLれます。右側の表の値。つまり、左側のテーブルのすべての行が少なくとも1回は出力に表示されます。
  3. 右外部結合:テーブルの役割が逆になっていることを除いて、左外部結合と同じです。
  4. 完全外部結合左外部結合と右外部結合の組み合わせ。両方のテーブルのすべての行が少なくとも1回は出力に表示されます。

「クロス結合」または「デカルト結合」は、結合条件が指定されていない内部結合であり、すべての行のペアが出力されます。

省略した完全結合を指摘してくれたRusselHに感謝します。


1
完全外部結合とクロス結合(デカルト積)はどうですか?
SQLMenace 2009年

fullは2つの外部結合に相当します
RussellH

25
FULLは、内部結合を台無しにした場合に得られるものであり、ここで「なぜNではなくN ^ 2行を取得するのですか」という質問をしますか?その後、誰もがあなたにクロスを取得します。
ポールトンブリン

24

SQL JOINSの違い:

覚えるのは非常に簡単:

INNER JOIN 両方のテーブルに共通のレコードのみを表示します。

OUTER JOIN 両方のテーブルのすべてのコンテンツは、一致するかどうかにかかわらずマージされます。

LEFT JOINLEFT OUTER JOIN- と同じ(最初の(左端の)テーブルから、右のテーブルレコードと一致するレコードを選択します。)

RIGHT JOINと同じですRIGHT OUTER JOIN(左のテーブルレコードと一致する2番目(右端)のテーブルからレコードを選択します)。

ここに画像の説明を入力してください


ベン図の円にラベルを付けるには、適切で適切な方法がありますが、これはそうではありません。円は入力テーブルではありません。また、結果行は入力行ではないため、説明が間違っています。また、これは明確ではありません。「両方に共通」、「一致」、「マージ」については説明しません。
philipxy

9

ウィキペディアの結合(SQL)を確認してください。

  • 内部結合-2つのテーブルを指定すると、内部結合は両方のテーブルに存在するすべての行を返します
  • 左/右(外部)結合-2つのテーブルを指定すると、結合の左または右のテーブルに存在するすべての行が返されます。さらに、結合句が一致する場合、反対側の行が返されるか、nullが返されますそれらの列

  • 完全外部-与えられた2つのテーブルがすべての行を返し、左または右のいずれかの列が存在しない場合はnullを返します

  • クロス結合-デカルト結合であり、慎重に使用しないと危険な場合があります


6

より目立つようにすると役立つ場合があります。一例:

表1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

表2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

私がするとき私が得るもの:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINおよびのRIGHT JOINタイプですOUTER JOIN

INNER JOIN デフォルトです-両方のテーブルの行が結合条件に一致する必要があります。


5
この回答に多くの賛成票があるのは信じられませんが、同時にそれは非常に不完全です。
nbro

元の質問に対するより良い答えだったと思います。
RussellH 2017

3

内部結合:両方のテーブルからのデータがある場合、行のみを表示します。

外部結合(右/左):からすべての結果を示し、左/右ペア行(とテーブルそれがあれば)存在するかどうか。


2

最初に、joinの機能を理解する必要がありますか?複数のテーブルを接続し、結合されたテーブルから特定の結果を取得します。これを行う最も簡単な方法は、クロス結合です。

tableAに2つの列AとBがあるとします。tableBには3つの列CとDがあります。クロス結合を適用すると、無意味な行がたくさん生成されます。次に、実際のデータを取得するために主キーを使用して照合する必要があります。

左:左のテーブルのすべてのレコードと右のテーブルの一致したレコードを返します。

右:左結合とは逆に戻ります。右のテーブルのすべてのレコードと左のテーブルの一致したレコードを返します。

内側:これは交差点のようなものです。両方のテーブルから一致したレコードのみを返します。

外:これは組合のようなものです。両方のテーブルから利用可能なすべてのレコードを返します。

すべてのデータが必要なわけではなく、共通のデータまたはレコードのみが必要な場合もあります。これらの結合メソッドを使用して簡単に取得できます。左右の結合も外部結合であることを覚えておいてください。

クロス結合を使用するだけですべてのレコードを取得できます。しかし、何百万ものレコードになると、それは高価になる可能性があります。そのため、左、右、内部、または外部結合を使用して簡単にします。

ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.