これらすべての異なる結合をどのように区別するのか疑問に思っています...
9 に答える
簡単な例Students
:テーブルとテーブルがあるとしましょうLockers
。SQL では、結合で指定する最初のテーブルStudents
はLEFTテーブルで、2 番目のテーブルLockers
はRIGHTテーブルです。
各生徒はロッカーに割り当てることができるためLockerNumber
、表に列がありStudent
ます。複数の生徒が 1 つのロッカーに入っている可能性がありますが、特に学年の初めには、ロッカーのない生徒や、生徒が割り当てられていないロッカーが入る可能性があります。
この例では、100 人の学生がいて、そのうち 70 人がロッカーを持っているとします。合計50 個のロッカーがあり、そのうち 40 個には少なくとも 1 人の生徒がいて、10 個のロッカーには生徒がいません。
INNER JOIN
は、" show me all students with lockers "と同等です。
ロッカーのない生徒、または生徒のいないロッカーが行方不明になります。
70 行を返します
LEFT OUTER JOIN
「すべての生徒を見せてください。対応するロッカーがある場合はそれも一緒に見せてください」.
これは一般的な学生リストである場合もあれば、ロッカーのない学生を識別するために使用する場合もあります。
100 行を返します
RIGHT OUTER JOIN
「すべてのロッカーと、それらに割り当てられている学生がいる場合はそれらを表示します」となります。
これは、学生が割り当てられていないロッカー、または学生が多すぎるロッカーを識別するために使用できます。
80 行を返します(40 のロッカーにいる 70 人の学生と、学生がいない 10 のロッカーのリスト)
FULL OUTER JOIN
ばかげて、おそらくあまり役に立たないでしょう。「すべての生徒とすべてのロッカーを見せて、できる限り一致させてください」
のようなもの110 行を返します(ロッカーのない生徒を含む 100 人の生徒全員。さらに、生徒のいない 10 個のロッカー)
CROSS JOIN
このシナリオでは、かなりばかげています。
学生テーブルのリンクされたフィールドを使用しないため、lockernumber
基本的に、実際に存在するかどうかに関係なく、可能なすべての学生とロッカーのペアリングの巨大なリストになります。5000 行(100 人の学生 x 50 ロッカー) を
返します。新入生と空のロッカーを照合するための出発点として (フィルタリングを使用して) 役立つ可能性があります。
結合には、次の 3 つの基本的なタイプがあります。
INNER
join は 2 つのテーブルを比較し、一致する結果のみを返します。1 番目のテーブルのレコードは、2 番目の複数の結果と一致する場合に複製されます。INNER 結合は結果セットを小さくする傾向がありますが、レコードが複製される可能性があるため、これは保証されません。CROSS
join は 2 つのテーブルを比較し、両方のテーブルから可能なすべての行の組み合わせを返します。この種の結合からは意味のない多くの結果が得られる可能性があるため、注意して使用してください。OUTER
join は 2 つのテーブルを比較し、一致するものがある場合はデータを返し、それ以外の場合は NULL 値を返します。INNER 結合と同様に、これは一方のテーブルの複数のレコードと一致する場合、一方のテーブルの行を複製します。OUTER 結合は、結果セットからレコードを削除しないため、結果セットが大きくなる傾向があります。OUTER 結合を修飾して、NULL 値を追加するタイミングと場所を決定する必要もあります。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
: 特定の Invoice のすべての "InvoiceLines" レコードと、対応する "InventoryItem" レコードを返す必要があります。これは、サービスも販売するビジネスであり、すべての InvoiceLines に IventoryItem があるわけではありません。CROSS
: 10 行の数字テーブルがあり、それぞれが値 '0' から '9' を保持しています。結合対象の日付範囲テーブルを作成して、範囲内の日ごとに 1 つのレコードを作成したいと考えています。このテーブルをそれ自体で繰り返し CROSS 結合することにより、必要な数の連続した整数を作成できます (10 の 1 乗から開始すると、結合ごとに指数に 1 が追加されます)。次に、DATEADD() 関数を使用して、これらの値を範囲の基準日に追加します。
4種類しかありません:
- 内部結合:最も一般的なタイプ。結合条件に一致する入力行のペアごとに、出力行が生成されます。
- 左外部結合:内部結合と同じですが、右側のテーブルに一致する行が見つからない行がある場合、左側のテーブルの値を含む行が出力さ
NULL
れます。右の表の値。これは、左側のテーブルのすべての行が少なくとも1回は出力に表示されることを意味します。 - 右外部結合:テーブルの役割が逆になっていることを除いて、左外部結合と同じです。
- 完全外部結合:左右の外部結合の組み合わせ。両方のテーブルのすべての行が、少なくとも1回は出力に表示されます。
「クロス結合」または「デカルト結合」は、結合条件が指定されていない単なる内部結合であり、結果としてすべての行のペアが出力されます。
省略した完全結合を指摘してくれたRusselHに感謝します。
ウィキペディアで Join (SQL) を確認してください
- 内部結合 - 2 つのテーブルを指定すると、内部結合は両方のテーブルに存在するすべての行を返します
左/右 (外部) 結合 - 与えられた 2 つのテーブルは、結合の左または右のテーブルに存在するすべての行を返します。さらに、結合句が一致する場合は反対側の行が返されます。または null が返されます。それらの列
Full Outer - 与えられた 2 つのテーブルはすべての行を返し、左または右の列が存在しない場合は null を返します
交差結合 - デカルト結合であり、慎重に使用しないと危険な場合があります
LEFT JOIN
とRIGHT JOIN
は の型ですOUTER JOIN
。
INNER JOIN
がデフォルトです。両方のテーブルの行が結合条件に一致する必要があります。
内部結合: 両方のテーブルからのデータがある場合、行のみを表示します。
外部結合: (左/右) :存在するかどうかに関係なく、対になった行を含む左/右のテーブルからのすべての結果を表示します。