Pablo Santa Cruz による回答は正しいですが、このページに遭遇してさらに説明が必要な場合は、ここに詳細な内訳を示します。
次のテーブルがあるとします:
以下に示す内部結合:
では、以下に示すように、両方のテーブルに表示されるレコードのみを表示できます。 リーリー
接続のどちら側でレコードの欠落を許可するかを指定する必要があります。
と RIGHT JOIN は、LEFT OUTER JOIN と RIGHT OUTER JOIN の短縮形です。フルネームの下ではそれらを使用します。外部結合と内部結合の概念を強化します。 左外部結合
RIGHT JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
... は、次のように、右側のテーブルに一致があるかどうかに関係なく、左側のテーブルからすべてのレコードを取得します。 リーリー
完全外部結合
完全な外部結合では、もう一方のテーブルに一致があるかどうかに関係なく、両方のテーブルのすべてのレコードが得られます。一致しない場合は両側で NULL になります。結果は次のようになります:
は、「これら 2 つのクエリを実行し、その結果を積み重ねる」と考えることができます。一部の行は最初のクエリから取得され、一部の行は 2 番目のクエリから取得されます。
MySQL の
は完全な重複を排除することに注意することが重要です。ここでは両方のクエリに Tim が表示されますが、UNION の結果には Him が 1 回だけリストされます。私の同僚のデータベース専門家は、この動作に依存すべきではないと考えています。したがって、これをより明確にするために、2 番目のクエリに
UNION
句を追加できます。 リーリー 一方、何らかの理由で 重複を表示したい場合は、UNION ALL を使用できます。
一方、何らかの理由で
UNION ALL
MySQL には 完全な接続 はありませんが、エミュレートすることはできます 。
このスタック オーバーフローの質問から転写されたコードの場合 例 次のようになります。
リーリー
完全外部結合操作によって重複行が生成されない特殊なケースに適しています。上記のクエリは、UNION 集合演算子に依存して、クエリ パターンによって導入された重複行を削除します。 2 番目のクエリで anti-join パターンを使用し、次に UNION ALL セット演算子を使用して 2 つのセットを結合することで、重複行の導入を回避できます。完全外部結合が重複行を返すより一般的なケースでは、次のようにすることができます: リーリー
Pablo Santa Cruz による回答は正しいですが、このページに遭遇してさらに説明が必要な場合は、ここに詳細な内訳を示します。
テーブルの例
次のテーブルがあるとします:
リーリー内部結合
以下に示す内部結合:
リーリーでは、以下に示すように、両方のテーブルに表示されるレコードのみを表示できます。 リーリー
内部結合は明示的に双方向であるため、方向 (例: 左または右) がありません。両方の側が一致する必要があります。接続のどちら側でレコードの欠落を許可するかを指定する必要があります。
LEFT JOINと
左外部結合
RIGHT JOIN
は、LEFT OUTER JOIN
とRIGHT OUTER JOIN
の短縮形です。フルネームの下ではそれらを使用します。外部結合と内部結合の概念を強化します。以下に示す左外部結合:
リーリー... は、次のように、右側のテーブルに一致があるかどうかに関係なく、左側のテーブルからすべてのレコードを取得します。 リーリー
右外部結合リーリー
...次のように、左側のテーブルに一致するレコードがあるかどうかに関係なく、右側のテーブルからすべてのレコードを取得します。 リーリー完全外部結合
完全な外部結合では、もう一方のテーブルに一致があるかどうかに関係なく、両方のテーブルのすべてのレコードが得られます。一致しない場合は両側で NULL になります。結果は次のようになります:
リーリーただし、Pablo Santa Cruz 氏が指摘したように、MySQL はこれをサポートしていません。次のように、左結合と右結合の UNION を使用してエミュレートできます。 リーリー
UNIONは、「これら 2 つのクエリを実行し、その結果を積み重ねる」と考えることができます。一部の行は最初のクエリから取得され、一部の行は 2 番目のクエリから取得されます。
MySQL の
UNIONは完全な重複を排除することに注意することが重要です。ここでは両方のクエリに Tim が表示されますが、
WHEREUNION
の結果には Him が 1 回だけリストされます。私の同僚のデータベース専門家は、この動作に依存すべきではないと考えています。したがって、これをより明確にするために、2 番目のクエリに句を追加できます。 リーリー
一方、何らかの理由で
重複を表示したい場合は、UNION ALL
を使用できます。MySQL には 完全な接続 はありませんが、エミュレートすることはできます 。
このスタック オーバーフローの質問から転写されたコードの場合 例 次のようになります。
2 つのテーブル t1 と t2 があります:リーリー
上記のクエリは、
完全外部結合操作によって重複行が生成されない特殊なケースに適しています。上記のクエリは、UNION 集合演算子に依存して、クエリ パターンによって導入された重複行を削除します。 2 番目のクエリで anti-join パターンを使用し、次に UNION ALL セット演算子を使用して 2 つのセットを結合することで、重複行の導入を回避できます。完全外部結合が重複行を返すより一般的なケースでは、次のようにすることができます: リーリー