外部結合は、全てのSQL結合タイプの中で最も理解されていないものです。おそらく、外部結合が他の結合タイプよりも必要とされる頻度がやや少ないためです。いずれにせよ、外部結合について本質的に奇妙なことは何もありません。このブログ記事で説明するように、実際の外部結合のいくつかの例は、それらについての誤解や混乱を明確にするのに十分なはずです。
このブログでは、最初にOuter Joinステートメントの構文と目的について説明し、いくつかの実例を次に示します。
OUTER JOIN構文
OUTER JOIN(または必要に応じてFULL OUTER JOIN)キーワードは、左側(テーブルA)または右側(テーブルB)のテーブルレコードのいずれかに一致がある場合、結合された2つのテーブルの全てのレコードを返します。次のVENダイアグラムは、潜在的な一致とOUTER JOIN構文を示しています:
したがって、FULL OUTER JOINは、両方のテーブルから一致しない行と、両方のテーブルで一致する行を返します。つまり、結合フィールド(Clave)の値が両方のテーブルで一致するかどうかに関係なく、クエリによって行が返されます。
まだ混乱していますが、心配しないでください。次のセクションでいくつかの例を見て、問題を解決します。
OUTER JOINs In Practice
このチュートリアルでは、よく知られているNorthwindサンプルデータベースを使用します。
次のSQLステートメントは、全ての顧客と全ての注文を選択します:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName;
OUTER JOINクエリによって生成される結果セットの顕著な特徴の1つは、あるものが1つのテーブルには表示され、もう1つのテーブルには表示されないために、いずれかの結合された列にNull値が表示されることです。上記のクエリとNavicat Premium 16の結果のこのスクリーンキャプチャで確認できます:
もちろん、値は少なくとも1つのテーブルに表示される必要があるため、両方のテーブル列にNullが表示されることはありません。また、ContactName列にNullが存在することは、既存の顧客に関連付けられていない注文が行われたことを意味するため、問題があることにも注意してください。これは、データベースの設計に欠陥があることを示しており、最も可能性が高いのは外部キー制約の欠落です。
2番目の例では、プロジェクト管理データベース、つまりプロジェクトマネージャーとプロジェクトからデータをフェッチします。SQLは次のとおりです:
SELECT m.name member, p.title project FROM pm.members m FULL OUTER JOIN pm.projects p ON p.id = m.project_id;
ここでも、Null値が表示されています(少なくとも1つのNull)
この場合、結果は、現時点でJack Danielにプロジェクトがないことを示しています。これが問題を表すかどうかは、その組織の特定の操作によって異なります。プロジェクトマネージャーがプロジェクトを持たないことや、プロジェクトが割り当てられていないことは、どんな時でも完全に理にかなっている場合があります。
結論
今日のブログが、あなたのクエリでの外部結合の目的と使用法を明らかにするのに役立つことを願っています。警告の最後の言葉: 外部結合は結果セットが非常に大きくなる可能性があるため、慎重に使用し、WHEREなどのフィルタリング句を含めることで、返される行数を最小限に抑えてください。