結合に関しては、私たちのほとんどは主に 2 つのテーブルなどの制限を使用して作業します。ただし、より意味のあるデータ レイアウトと洞察を得るために、3 つのテーブルを結合する必要があるのが一般的です。たとえば、映画のリスト、対応するレンタル在庫、および実際のレンタルの詳細を取得したい場合を考えてみましょう。映画、在庫、レンタルの詳細などの各ユニットは、個別のテーブルにあります。
このチュートリアルでは、SQL で 3 つのテーブルを結合するために使用できるさまざまな結合とテクニックについて説明します。
要件:
デモンストレーションの目的で、MySQL バージョン 80 と Sakela サンプル データベースを使用します。手順に従って、Sakila データベースを MySQL サーバーにダウンロードしてセットアップできます。該当すると思われる他のデータセットを自由に使用してください。
SQL の結合の種類
結合の適用に入る前に、SQL データベースで使用できるさまざまな種類の結合について説明することから始めましょう。
内部結合
最初のタイプの結合は INNER JOIN です。このタイプの結合では、両方のテーブルで一致する値を含む行のみが返されます。これは非常に一般的な結合のタイプで、2 つのテーブルを結合する場合に最も単純です。
構文は次のとおりです。
SELECT 列テーブル1から
内部結合テーブル2 の上 テーブル1.列名 = テーブル2.列名;
左結合
LEFT JOIN の場合、左側のテーブルからすべての行と、右側のテーブルから一致した行が返されます。右側のテーブルに一致する値がない場合、結合によりその場所に NULL 値が追加されます。
構文は次のとおりです。
SELECT 列テーブル1から
LEFT JOIN テーブル 2 の上 テーブル1.列名 = テーブル2.列名;
右結合
ご想像のとおり、RIGHT JOIN は LEFT JOIN の逆です。このタイプの結合では、右側のテーブルからすべての行が返され、左側のテーブルからは一致する行のみが返されます。左側のテーブルに一致する行がない場合、結合によって NULL 値がテーブルに追加されます。
RIGHT JOIN の構文は次のとおりです。
SELECT 列テーブル1から
右結合テーブル2 の上 テーブル1.列名 = テーブル2.列名;
完全外部結合
SQL データベースで次に使用される結合のタイプは、FULL OUTER JOIN です。このタイプの結合では、右側または左側のテーブルに一致がある場合にすべての行が返されます。 2 つのどちらにも一致する値がない場合は、一致しないテーブルの列に対して NULL を返します。
以下は、FULL OUTER JOIN の構文を示しています。
SELECT 列テーブル1から
FULL OUTER JOIN テーブル 2 の上 テーブル1.列名 = テーブル2.列名;
すべてのデータベース エンジンが FULL OUTER JOINS をサポートしているわけではないことに留意してください。これを実現するには、他のタイプの JOINS またはサブクエリを使用する必要がある場合があります。
例:
これらのタイプの結合を使用して SQL で 3 つのテーブルを結合する方法について、いくつかの例を見てみましょう。
例 1: INNER JOIN の使用
INNER JOIN から始めます。映画のリスト、レンタル在庫、および対応するレンタルの詳細を取得するとします。
次の例に示すように、関連付けられたテーブルで複数の INNER JOINS を使用できます。
選択する映画のタイトル、
在庫.在庫_id、
レンタル.レンタル日
から
映画
内部結合インベントリ の上
フィルム.フィルム_id = 在庫.フィルム_id
INNER JOINレンタル の上
在庫.在庫_id = レンタル.在庫_id;
指定されたクエリ例では、「film_id」列に基づいてフィルム テーブルと在庫テーブルを結合することから始めます。次に、結果のセットを取得し、「inventory_id」列に基づいてレンタル テーブルと結合します。
これにより、3 つのテーブルが基本的な INNER JOIN で結合されます。結果のセットは次のようになります。
例 2: INNER JOIN と LEFT JOIN の使用
映画のリスト、レンタル在庫のリスト (存在する場合)、および関連するレンタルの詳細が必要だとします。
また、映画にレンタル在庫がない場合でも、結果にレンタル在庫が含まれるようにしたいと考えています。ここで INNER JOIN と LEFT JOIN が登場します。
次の例を考えてみましょう。
選択する映画のタイトル、
在庫.在庫_id、
レンタル.レンタル日
から
映画
内部結合インベントリ の上
フィルム.フィルム_id = 在庫.フィルム_id
LEFT JOINレンタル の上
在庫.在庫_id = レンタル.在庫_id;
この例では、INNER JOIN を使用してフィルムと在庫テーブルを結合し、利用可能な在庫を持つタイトルを確実に取得します。次に、LEFT JOIN を使用してレンタル テーブルに結合し、利用可能な場合はレンタルの詳細を取得し、レンタル履歴がないタイトルについては NULL を取得します。
結果のセットは次のようになります。
結論
このチュートリアルでは、SQL のさまざまなタイプの JOINS とその仕組み、および JOINS を使用して 3 つのテーブルを結合する方法について学びました。