回答:
簡単な例:Students
テーブルとテーブルがあるとしLockers
ます。SQLでは、結合で指定する最初のテーブルStudents
はLEFTテーブルで、2番目のテーブルLockers
はRIGHTテーブルです。
各学生をロッカーに割り当てることができるためLockerNumber
、Student
テーブルに列があります。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個のロッカー)。新入生と空のロッカーを一致させるための出発点として(フィルタリングを使用して)役立ちます。
SELECT * FROM students RIGHT OUTER JOIN lockers...
とは異なる結果になりSELECT * FROM lockers RIGHT OUTER JOIN students...
ます。すばらしい回答ですが、完全なSQL
クエリで更新されることを
結合には3つの基本的なタイプがあります。
INNER
joinは2つのテーブルを比較し、一致する結果のみを返します。最初のテーブルのレコードは、2番目の複数の結果と一致する場合に複製されます。INNER結合は結果セットを小さくする傾向がありますが、レコードを複製できるため、これは保証されません。CROSS
joinは2つのテーブルを比較し、両方のテーブルから行の可能なすべての組み合わせを返します。この種類の結合からは意味のない結果が多数得られる可能性があるため、注意して使用してください。OUTER
joinは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()関数を使用して、これらの値を範囲の基準日に追加します。4種類しかない:
NULL
れます。右側の表の値。つまり、左側のテーブルのすべての行が少なくとも1回は出力に表示されます。 「クロス結合」または「デカルト結合」は、結合条件が指定されていない内部結合であり、すべての行のペアが出力されます。
省略した完全結合を指摘してくれたRusselHに感謝します。
SQL JOINSの違い:
覚えるのは非常に簡単:
INNER JOIN
両方のテーブルに共通のレコードのみを表示します。
OUTER JOIN
両方のテーブルのすべてのコンテンツは、一致するかどうかにかかわらずマージされます。
LEFT JOIN
LEFT OUTER JOIN
- と同じ(最初の(左端の)テーブルから、右のテーブルレコードと一致するレコードを選択します。)
RIGHT JOIN
と同じですRIGHT OUTER JOIN
(左のテーブルレコードと一致する2番目(右端)のテーブルからレコードを選択します)。
ウィキペディアの結合(SQL)を確認してください。
左/右(外部)結合-2つのテーブルを指定すると、結合の左または右のテーブルに存在するすべての行が返されます。さらに、結合句が一致する場合、反対側の行が返されるか、nullが返されますそれらの列
完全外部-与えられた2つのテーブルがすべての行を返し、左または右のいずれかの列が存在しない場合はnullを返します
クロス結合-デカルト結合であり、慎重に使用しないと危険な場合があります
より目立つようにすると役立つ場合があります。一例:
表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
LEFT JOIN
およびのRIGHT JOIN
タイプですOUTER JOIN
。
INNER JOIN
デフォルトです-両方のテーブルの行が結合条件に一致する必要があります。
最初に、joinの機能を理解する必要がありますか?複数のテーブルを接続し、結合されたテーブルから特定の結果を取得します。これを行う最も簡単な方法は、クロス結合です。
tableAに2つの列AとBがあるとします。tableBには3つの列CとDがあります。クロス結合を適用すると、無意味な行がたくさん生成されます。次に、実際のデータを取得するために主キーを使用して照合する必要があります。
左:左のテーブルのすべてのレコードと右のテーブルの一致したレコードを返します。
右:左結合とは逆に戻ります。右のテーブルのすべてのレコードと左のテーブルの一致したレコードを返します。
内側:これは交差点のようなものです。両方のテーブルから一致したレコードのみを返します。
外:これは組合のようなものです。両方のテーブルから利用可能なすべてのレコードを返します。
すべてのデータが必要なわけではなく、共通のデータまたはレコードのみが必要な場合もあります。これらの結合メソッドを使用して簡単に取得できます。左右の結合も外部結合であることを覚えておいてください。
クロス結合を使用するだけですべてのレコードを取得できます。しかし、何百万ものレコードになると、それは高価になる可能性があります。そのため、左、右、内部、または外部結合を使用して簡単にします。
ありがとう