TOP

SQL レッスン 11. テーブルの高度な組み合わせ (OUTER JOIN)

前のセクションでは、WHERE 文と INNER JOIN 文を使用して、テーブルを結合する最も簡単な方法を検討しました。このような組み合わせを内部結合または同値結合と呼びます。ただし、SQL にはテーブルを結合するためのオプションがさらに多くあります。つまり、外部結合、自然結合、自己結合など、他のタイプの結合もあります。ただし、最初にテーブルにエイリアスを割り当てる方法を考えてみましょう。後でフィールドの完全な名前 (Table.Field) を使用する必要があり、省略形がなければ長さが長いため操作が非常に困難になります。


1. テーブルの別名(Aliases)の使用

前のセクションでは、エイリアスを使用して特定のテーブル フィールドまたは計算フィールドを参照する方法を学びました。 SQL では、テーブル名の代わりにエイリアスを使用することもできます。これにより、SQL 構文が短縮され、SELECT ステートメントで同じテーブルを複数回使用できるなどの利点が得られます。

Run SQLSELECT Seller_name, SUM(Amount) AS Sum1 
FROM Sellers AS S, Sumproduct AS SP 
WHERE S.City = SP.City 
GROUP BY Seller_name

販売者ごとに販売された商品の合計金額を表示しました。 SQL クエリでは、次のエイリアスを使用しました。計算フィールド SUM(Amount) にはエイリアス Sum1、テーブル Sellers にはエイリアス S、Sumproduct にはエイリアス SP を使用しました。テーブル エイリアスは、ORDER BY、GROUP BY などの他の文でも使用できることに注意してください。

2. 自己接続 (SELF JOIN)

例を考えてみましょう。 John Smith と同じ国で取引を行う販売者の住所を知る必要があるとします。これを行うには、次のリクエストを作成します。

Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country 
                 FROM Sellers 
                 WHERE Seller_name = 'John Smith')

また、次のコードを記述することで、自己接続を通じてこの問題を解決できます。

Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2 
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'

この問題を解決するために、仮名が使用されました。初めてテーブル Sellers にエイリアス S1 が割り当てられ、2 回目ではエイリアス S2 が割り当てられました。これらの別名はテーブル名として使用できます。 WHERE 演算子では、各フィールドの名前にプレフィックス S1 を追加します。これにより、DBMS はどのテーブルのフィールドを出力すべきかを理解できるようになります (1 つのテーブルから 2 つの仮想テーブルを作成したため)。 WHERE 句は、最初にテーブルを結合し、次に Seller_name フィールドによって 2 番目のテーブルのデータをフィルタリングして、必要な値のみを返します。

自己結合は、外部演算子 SELECT と同じテーブルからデータを選択するサブクエリを置き換えるためによく使用されます。最終結果は同じですが、多くの DBMS はサブクエリよりも結合をはるかに高速に処理します。どのクエリがより速く動作するかを判断するには、試してみる価値があります。

3. 自然な組み合わせ

自然結合は、繰り返さない列のみを選択する結合です。これは通常、1 つのテーブルに (SELECT *) を書き込み、残りのテーブルにフィールドのリストを指定することによって行われます。例:

Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S 
WHERE SP.City = S.City

この例では、ワイルドカード (*) は最初のテーブルにのみ使用されます。他のすべての列は明示的に指定されるため、重複する列は選択されません。

4. 外部結合(OUTER JOIN)

通常、マージする場合、あるテーブルの行は別のテーブルの対応する行にリンクされますが、場合によっては、別のテーブルに関連する行を持たない行 (つまり、すべての行) を結果に含める必要がある場合があります。あるテーブルの行が選択され、別のテーブルから関連する行のみが追加されます。このタイプの接続は外部と呼ばれます。このために、キーワード OUTER JOIN ... ON ... に接頭辞 LEFT または RIGHT を付けて使用します。

以前に、まだ売上を持っていない新しい販売者 Semuel Piter を Sellers テーブルに追加した例を考えてみましょう。

Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2 
LEFT OUTER JOIN Sumproduct 
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name

このリクエストにより、データベース内のすべての販売者のリストを抽出し、すべての月に販売された商品の合計金額を計算しました。新しい販売者 Semuel Piter の売上がないことがわかります。内部結合を使用した場合、Sumproduct テーブルにレコードがないため、新しい販売者は表示されません。書くだけでなく組み合わせの方向を変えることもできます LEFT または RIGHT だけでなく、テーブルの順序を変更するだけでも (つまり、次の 2 つのレコードは同じ結果になります: Sellers LEFT OUTER JOIN Sumproduct および Sumproduct RIGHT OUTER _t) blJOIN Sellers)。

また、一部の DBMS では、記号 *= および =* を使用した単純化されたレコードでの外部結合が許可されており、それぞれ LEFT OUTER JOIN および RIGHT OUTER JOIN に対応します。したがって、前のクエリは次のように書き換えることができます。

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City

残念ながら、MS Access は外部結合の短縮レコードをサポートしていません。

5. 完全外部結合 (FULL OUTER JOIN)

別のタイプの外部結合もあります。完全外部結合です。これは、両方のテーブルのすべての行を表示し、関連する行のみを結合します。完全な外部結合の構文は次のとおりです。

SELECT Seller_name, Product
FROM Sellers 
FULL OUTER JOIN Sumproduct 
ON Sellers.City = Sumproduct.City

繰り返しますが、完全外部結合は、MS Access、MySQL、SQL Server、および Sybase の DBMS ではサポートされていません。この不公平を回避する方法については、次のセクションで検討します。