広告 基本情報技術者

【基本情報技術者試験】内部結合と外部結合

2024年5月18日

教授
教授

今回のテーマは「内部結合」と「外部結合」についてです。

内部結合?外部結合?

助手
助手

問題

"注文"表と"製品"表に対して,次のSQL文を実行したときに得られる結果はどれか。

SELECT 製品名, 数量 FROM 注文, 製品

   WHERE 注文.製品コード = 製品.製品コード

注文テーブル
製品テーブル

ア:

回答ア

イ:

回答イ

ウ:

回答ウ

エ:

回答エ

基本情報技術者令和2年免除 問28 ※表は過去問を参考に作成したものです。

基本情報技術者試験や応用情報技術者試験で出題されるテーブル結合の問題。内部結合と外部結合の動きを知らないと難しく感じる問題ですが、知っていればそこまで難しい問題ではありません。

本記事では、「内部結合」と「外部結合」について解説しています。

本記事で学べること

  • 内部結合について理解する
  • 外部結合について理解する
  • 基本情報技術者試験の過去問の解き方を学ぶ

スポンサーリンク

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句」、どちらも実行結果は同じです。

外部結合

外部結合は、基準となるテーブルを指定します。

どちらのテーブルを基準にするかを指定し、その基準となるテーブルに存在するレコードを抽出、基準ではないテーブルからは、結合条件に合致するレコードのみを抽出して結合します。

Memo

  • 内部結合:結合条件に指定した項目の値が、両方のテーブルにあれば抽出する
  • 外部結合:結合条件に指定した項目の値が、基準テーブルにあれば抽出する

左外部結合(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 注文.製品コード = 製品.製品コード

注文テーブル
製品テーブル

ア:

回答ア

イ:

回答イ

ウ:

回答ウ

エ:

回答エ

基本情報技術者令和2年免除 問28 ※表は過去問を参考に作成したものです。

設問のSQLは、注文テーブルと製品テーブルを「注文.製品コード=製品.製品コード」の結合条件で、内部結合しています。

SELECT 
    製品名
    ,数量 
FROM
    注文, 製品
WHERE 
    注文.製品コード = 製品.製品コード

内部結合は、結合条件に指定した項目の値が、両方のテーブルに存在する場合のみ、お互いのレコードを抽出して結合します。

注文テーブルと製品テーブル、どちらにも存在する「製品コード」は次のとおりです。(黄色:両方のテーブルにある、グレー:片方のテーブルにしかない)

内部結合

黄色のレコードを結合(内部結合)した結果が次のとおりです。

内部結合の結果

この表から「製品名」と「数量」を取り出します。

SELECT 製品名, 数量
回答ウ
助手
助手

「ウ」が正解です。

helpful