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