今回のテーマは「内部結合」と「外部結合」についてです。
内部結合?外部結合?
基本情報技術者試験や応用情報技術者試験で出題されるテーブル結合の問題。内部結合と外部結合の動きを知らないと難しく感じる問題ですが、知っていればそこまで難しい問題ではありません。
本記事では、「内部結合」と「外部結合」について解説しています。
スポンサーリンク
目次
SQLのテーブル結合
抽出したい情報が複数のテーブルにある場合、それぞれのテーブルから対象のレコードを抽出し、組み合わせるのは手間がかかります。
例えば、次のように、社員テーブルの「社員名」と部署マスタテーブルの「部署名」が必要なとき、社員テーブルから対象レコードを抽出、部署マスタテーブルから対象レコードを抽出、その後、お互いの抽出結果を組み合わせる(部署IDで紐づける)必要があります。
このようなときに便利なのが、テーブルの結合です。SQLでは2のテーブルを結合し、1つのテーブルのように扱えます。
テーブル結合には「内部結合」と「外部結合」があります。
内部結合
内部結合は、結合条件に指定した項目の値が、両方のテーブルに存在する場合のみ、お互いのレコードを抽出して結合します。
次の例は、社員テーブルと部署マスタテーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で内部結合した結果です。
内部結合した結果、結合条件である「部署ID」が両方のテーブルに存在する「部署ID」"1"と"2"のレコードが結合され、片方のテーブルにしか存在しない「部署ID」"3"と"4"のレコードは結合されていません。
内部結合は、SQLの「INNER JOIN」もしくは「WHERE句」で指定できます。
■INNER JOINを使った例
SELECT
社員.社員ID
,社員.社員名
,社員.部署ID
,部署マスタ.部署名
FROM
社員 INNER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;
■WHEREを使った例
SELECT
社員.社員ID
,社員.社員名
,社員.部署ID
,部署マスタ.部署名
FROM
社員, 部署マスタ
WHERE
社員.部署ID = 部署マスタ.ID;
「INNER JOIN」と「WHERE句」、どちらも実行結果は同じです。
外部結合
外部結合は、基準となるテーブルを指定します。
どちらのテーブルを基準にするかを指定し、その基準となるテーブルに存在するレコードを抽出、基準ではないテーブルからは、結合条件に合致するレコードのみを抽出して結合します。
左外部結合(LEFT OUTER JOIN)
左外部結合(LEFT OUTER JOIN)は、左側のテーブルを基準とする外部結合です。
下記は、左外部結合のイメージ例です。社員テーブルと部署マスタテーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で左外部結合しています。
左側のテーブルを基準としているため、基準となる社員テーブルに存在するレコードを抽出し、基準ではない部署マスタテーブルからは、結合条件に合致したレコードのみ抽出します。
左外部結合した結果、「部署ID」が社員テーブルにしか存在しない「部署ID=4」のレコードには、社員テーブルのカラム(社員ID、社員名、部署ID)しか値が設定されていません。基準ではない部署マスタテーブルのカラム「部署名」には、NULLが入ります。
左外部結合する場合は、SQLの「LEFT OUTER JOIN」を使用します。※OUTERは省略可能
SELECT
社員.社員ID
,社員.社員名
,社員.部署ID
,部署マスタ.部署名
FROM
社員 LEFT OUTER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;
右外部結合(RIGHT OUTER JOIN)
右外部結合(RIGHT OUTER JOIN)は、右側のテーブルを基準とする外部結合です。
下記は、右外部結合のイメージ例です。社員テーブルと部署マスタテーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で右外部結合しています。
右側のテーブルを基準としているため、基準となる部署マスタテーブルに存在するレコードを抽出し、基準ではない社員テーブルからは、結合条件に合致したレコードのみ抽出します。
右外部結合した結果、「部署ID」が部署マスタテーブルにしか存在しない「部署ID=3」のレコードには、部署マスタテーブルのカラム(ID、部署名)しか値が設定されていません。基準ではない社員テーブルのカラム「社員ID」「社員名」には、NULLが入ります。
右外部結合する場合は、SQLの「RIGHT OUTER JOIN」を使用します。※OUTERは省略可能
SELECT
社員.社員ID
,社員.社員名
,部署マスタ.ID
,部署マスタ.部署名
FROM
社員 RIGHT OUTER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;
完全外部結合(FULL OUTER JOIN)
完全外部結合(FULL OUTER JOIN)は、両方のテーブルを基準とし、それぞれに一致しないレコードも抽出結果に含めます。
下記は、完全外部結合のイメージ例です。社員テーブルと部署マスタテーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で完全外部結合しています。
完全外部結合は、両方のテーブルを基準とするので、社員テーブル、部署マスタテーブルの両方に存在するレコードを抽出(部署IDが一致しないレコードも抽出対象に含める)します。
完全外部結合する場合は、SQLの「FULL OUTER JOIN」を使用します。※OUTERは省略可能
SELECT
社員.社員ID
,社員.社員名
,社員.部署ID
,部署マスタ.部署名
FROM
社員 FULL OUTER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;
基本情報技術者試験 過去問の解説
スポンサーリンク
基本情報技術者令和2年免除 問28
設問のSQLは、注文テーブルと製品テーブルを「注文.製品コード=製品.製品コード」の結合条件で、内部結合しています。
SELECT
製品名
,数量
FROM
注文, 製品
WHERE
注文.製品コード = 製品.製品コード
内部結合は、結合条件に指定した項目の値が、両方のテーブルに存在する場合のみ、お互いのレコードを抽出して結合します。
注文テーブルと製品テーブル、どちらにも存在する「製品コード」は次のとおりです。(黄色:両方のテーブルにある、グレー:片方のテーブルにしかない)
黄色のレコードを結合(内部結合)した結果が次のとおりです。
この表から「製品名」と「数量」を取り出します。
SELECT 製品名, 数量
「ウ」が正解です。