SQL ServerのLEFT JOINとLEFT OUTER JOINの比較


1595

違いは何であるLEFT JOINとはLEFT OUTER JOIN


213
無し!OUTERキーワードはオプションです。
jarlh

9
ベン図は、この質問への回答には適していません。この質問に対する答えはNoneです。最初のコメントを参照してください。
philipxy

3
ベン図を示す出力列の差のために特別なケース外部結合対インナーnullまたは重複する行が入力されない場合(テーブルを行値のセットにして、通常の数式の等価性を使用できるようにする場合)、左と右の円は出力テーブル/左と右の結合のセットを保持します。しかし、ヌルまたは重複する行が入力された場合、円が何のセットであるか、およびそれらのセットが入力および出力テーブル/バッグにどのように関連するかを説明することは非常に難しく、ベン図は役に立ちません。他のベン図の乱用については、こちらのコメントを参照してください。
philipxy

回答:


2237

ドキュメントに従って:FROM(Transact-SQL)

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

キーワードOUTERはオプションとしてマークされています(角括弧で囲まれています)。この特定のケースでは、指定してOUTERもしなくても違いはありません。他の要素が句に参加しながらも残して、オプションとしてマークされていることに注意してアウトになるの違いを作ります。

たとえば、JOIN句のtype-part全体はオプションであり、その場合のデフォルトはをINNER指定しJOINた場合のみです。つまり、これは合法です。

SELECT *
FROM A JOIN B ON A.X = B.Y

同等の構文のリストは次のとおりです。

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

また、私がこの他のSOの質問に残した答えを見てください:SQL左結合とFROM行の複数のテーブル?

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


135
正解です。OUTERはANSI-92互換性のために許可されています。
Sean Reilly、

11
@ LasseV.Karlsen 同等のリストのINNER JOIN右側とJOIN左側に配置する方が良いでしょうか?
nawfal 2013年

8
@ LasseV.Karlsen左側が簡潔なフォームで右側が拡張されたフォームであることを意味しました。JOINsについても同じようにフォローすると、一貫性があると思いました。
nawfal 2013年

30
@外れ値それはあなたの特権ですが、明らかに他の451人が答えは良いと思いました。正直に言うと、1つの回答がXで、別の回答がXで、ドキュメントを参照し、ドキュメントの関連部分を回答にコピーした場合、私の投票は2番目の回答に送られます。私がやります。Xが良くないと主張する人。X を証明できれば、それはより良いです(わずかなsactiwの答えではありません)。しかし、あなたが何をしたいかを考えるあなたの特権。なぜあなたはそれが無意味だと思うのか疑問に思いますが、答えは間違っていますか?
Lasse V. Karlsen

7
@外れ値正直に言うと、私の「長い」答えを読みたくない場合は、私の答えはあなたのためではありませんでした。これは、同じことについて不思議に思ってここに来るすべての人のためのものであり、その理由や詳細情報の入手先などについての背景が必要です。明らかに、あなたはこの答えを求めているような人です。「なし」ですが、残念ながらこれはここでのスタックオーバーフローに関する合法的な回答ではありません。
Lasse V. Karlsen、

700

あなたの質問答えるために、LEFT JOINとLEFT OUTER JOINの間に違いはありません、彼らは言ったのとまったく同じです...

トップレベルには、主に3種類の結合があります。

  1. 内側
  2. アウター
  3. クロス

  1. INNER JOIN-両方のテーブルに存在する場合、データをフェッチします。

  2. OUTER JOINには3つのタイプがあります。

    1. LEFT OUTER JOIN -左側のテーブルに存在する場合、データをフェッチします。
    2. RIGHT OUTER JOIN -右側のテーブルに存在する場合、データをフェッチします。
    3. FULL OUTER JOIN -2つのテーブルのいずれかに存在する場合、データをフェッチします。
  3. CROSS JOINは、その名前が示すように、[n X m]すべてをすべてに結合します。
    結合するテーブルを(ステートメントのFROM句でSELECT)単にリストするシナリオと同様に、コンマを使用してテーブルを区切ります。


注意点:

  • 単に言及JOINすると、デフォルトではINNER JOINです。
  • OUTER参加しなければならLEFT| RIGHT| FULL単に言うことはできませんOUTER JOIN
  • OUTERキーワードをドロップしてLEFT JOINRIGHT JOINor またはと発声することができますFULL JOIN

これらをより良い方法で視覚化したい人は、このリンクにアクセスしてください: SQL結合の視覚的説明


17
とても良い答えです。「LEFT OUTER JOIN-左のテーブルからすべてのデータを取得し、事前設定されている場合は、右から一致するデータをフェッチします」と言うと、より明確になります。2.1の場合(および2.2の同様の変更)
ssh

1
また、単純に「select * from TableA、TableB」を使用してクロス結合を行うこともできます
om471987

3
私がネクロバンプしている場合は申し訳ありませんがCROSS JOIN、と同じFULL JOINですか?
TechnicalTophat

9
@RhysOいいえ、CROSS JOINはデカルト積です。つまり、n行を持ち、m行を持つテーブルを持つテーブルのCROSS JOINは常に(n * m)行を与えますが、n行を持つテーブルのFULL OUTER JOINはm行のテーブルでは、最大(n + m)行になります
sactiw

1
@sactiwは、Cross JoinFull Outer Join... の違いについての貴重な回答に特別な注記を追加することを検討します。
Manuel Jordan、

356

左結合と左外部結合の違いは何ですか?

何もないLEFT JOINLEFT OUTER JOIN同等です。


13
こんにちは!誰がこれに反対票を投じたのですか?LEFT JOINはLEFT OUTER JOINと同じです。
ミッチウィート

7
これは、Microsoft SQL Serverおよびその他のSQL準拠のRDBMSの場合です。
ビルカーウィン、

7
OUTERがオプションである理由についての参照または説明を追加すると便利です。
Zero3

7
ここで最も簡潔で正確な答え。
Manachi

4
ありがとうございました。受け入れられた答えはあまりにも多くの情報を持っていて、私をより混乱させました。これはまさに私が知る必要があったものであり、元の質問に正直に答えます。
ベーコンブラッド

66

私はPostgreSQLのDBAですが、外部結合の違いと外部結合の違いの違いを理解できる限り、インターネット全体でかなり議論されているトピックです。今日まで、これらの2つの違いを見たことがありませんでした。それで私はさらに進んで、それらの違いを見つけようとします。最後に、ドキュメント全体を読み、その答えを見つけました。

したがって、ドキュメント(少なくともPostgreSQLでは)を見ると、次のフレーズを見つけることができます。

「言葉INNEROUTER、すべての形態のオプションです。INNERデフォルトで、LEFTRIGHT、とFULL。外部結合を意味するものではあり」

つまり、

LEFT JOINそして、LEFT OUTER JOIN同じです

RIGHT JOINそして、RIGHT OUTER JOIN同じです

それがまだ答えを見つけようとしている人のための貢献になることを願っています。


60

Left JoinそしてLeft Outer Join1とされている同じ。前者は後者の省略形です。Right Joinand Right Outer Join関係についても同じことが言えます。デモでは平等を示します。各クエリの実際の例は、SQL Fiddleを介して提供されています。このツールを使用すると、クエリを直接操作できます。

与えられた

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

左結合左外部結合

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

結果

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


右結合右外部結合

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

結果

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


43

結合は次の順序で考えると簡単です。

  • CROSS JOIN-両方のテーブルのデカルト積。すべての結合はここから始まります
  • INNER JOIN-フィルターが追加されたCROSS JOIN。
  • OUTER JOIN-(LEFTまたはRIGHTテーブルのいずれかから)欠落したエレメントが後に追加されたINNER JOIN。

私がこの(比較的)単純なモデルを理解するまで、JOINSは常に少し黒っぽいアートでした。今、彼らは完全に理にかなっています。

これが混乱する以上に役立つことを願っています。


これは質問の答えにはなりません。
philipxy

33

LEFT / RIGHTとLEFT OUTER / RIGHT OUTERが同じなのはなぜですか?なぜこの語彙なのかを説明しましょう。LEFTおよびRIGHT結合はOUTER結合の特定のケースであるため、OUTER LEFT / OUTER RIGHT以外にはなり得ないことを理解してください。OUTERも呼ばれる参加FULL LEFTとRIGHTとは対照的に、OUTERはそれがある参加しPARTIAL OUTERの結果参加します。確かに:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

これらの操作にエイリアスがある理由が明らかになり、INNER、OUTER、CROSSの3つのケースしか存在しないことが明らかになりました。OUTERの2つのサブケース。語彙、教師がこれを説明する方法、および上記のいくつかの回答により、多くの場合、さまざまな種類の結合があるように見えます。しかし、それは実際には非常に簡単です。


1
「3つのケースしか存在しないことは明らかです」:興味深いが欠陥がある。内部結合は特殊なクロス結合であると考えてください(つまり、結合述語をwhere句に移動します)。さらに、外部結合は結合ではなく、「欠落した」列の代わりにnullが使用される共用体であると考えてください。したがって、クロスが唯一必要な結合であると主張することができます。関係理論における現在の考え方は、自然結合はすべての結合要件を満たすということです。余談ですが、語彙が「JOIN意味するINNER JOIN」と外部結合語彙の推論に適合するかどうか、またはどのように説明することができますか?
16

27

あなたの質問に答えるために

SQL Serverの結合構文では、OUTERはオプションです

msdnの記事に記載されています:https ://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

したがって、次のリストは、OUTERがある場合とない場合の結合の同等の構文を示しています

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

その他の同等の構文

INNER JOIN => JOIN
CROSS JOIN => ,

Dotnet Mob Articeを強くお勧めしますSQL Serverへの参加 ここに画像の説明を入力してください


2
ここでのベン図の乱用については、質問に対する私のコメントを参照してください。
philipxy

20

結合は3つしかありません。

  • A)クロス結合=デカルト(例:テーブルA、テーブルB)
  • B)内部結合= JOIN(例:テーブルA結合/内部結合テーブルB)
  • C)外部結合:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

お役に立てれば幸いです。


1
つまり、5人が参加します。
Zeek2

19

JOINには主に3つのタイプがあります

  1. 内部:両方のテーブルに存在するデータをフェッチします
    • JOINのみがINNER JOINを意味します
  2. 外側:3つのタイプ

    • LEFT OUTER--左のテーブルと一致条件にのみ存在するデータをフェッチします
    • RIGHT OUTER--右側のテーブルと一致する条件にのみ存在するデータをフェッチします
    • FULL OUTER--テーブルのいずれかまたは両方に存在するデータをフェッチします
    • (左または右または完全)OUTER JOINは、「OUTER」を記述せずに書き込むことができます
  3. クロス結合:すべてをすべてに結合します


16

構文糖は、結合が内部結合ではないことをカジュアルな読者に明らかにします。


2
では、FULL OUTER JOINとは何でしょうか。
エイミーB

5
tableA FULL OUTER JOIN tableBは、3種類のレコードを提供します。tableBに一致するレコードがないtableAのすべてのレコード、tableAに一致するレコードがないtableBのすべてのレコード、tableBに一致するレコードがあるtableAのすべてのレコード。
Dave DuPlantis

4

この質問に関連して、2つの「APPLY」演算子も投稿したいと思います。

結合

  1. INNER JOIN = JOIN

  2. 外部結合

    • LEFT OUTER JOIN = LEFT JOIN

    • RIGHT OUTER JOIN = RIGHT JOIN

    • FULL OUTER JOIN = FULL JOIN

  3. CROSS JOIN

自己結合:これは、別のタイプの結合ではありません。これは基本的に、上記のいずれかの結合を使用してテーブルをそれ自体に結合します。しかし、SQL開発者コミュニティの多くの人からこの用語が聞こえるので、JOINディスカッションのコンテキストで言及する価値があると感じました。

適用

  1. CROSS APPLY -INNER JOINに似ています(ただし、左テーブルの各行について右テーブルで何かを計算でき、一致する行のみを返すという利点が追加されています)
  2. OUTER APPLY -LEFT OUTER JOINに似ています(ただし、左テーブルの各行について右テーブルで何かを計算できるという利点が追加され、右テーブルの一致に関係なく、左テーブルからすべての行が返されます)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

実際の例、SQLでOUTER / CROSS APPLYを使用する場合

APPLY演算子は、サブクエリで同じ計算を行う必要がある場合よりもパフォーマンスが向上するため、非常に有益です。また、SQL Serverの古いバージョンの多くの分析関数の代わりにもなります。そのため、JOINSに慣れた後は、SQL開発者の1人が次にAPPLY演算子について学習する必要があると思います。

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