目次
内部結合と外部結合
テーブルの結合には、内部結合と外部結合があります。
内部結合と外部結合の違い
内部結合:両方のテーブルに存在するデータを抽出する結合
外部結合:基準となるテーブルに存在すれば抽出する結合
スポンサーリンク
内部結合とは
内部結合は、結合条件に指定した項目の値が、両方のテーブルに存在する場合のみ、お互いのレコードを抽出して結合します。
例えば、以下は「社員」テーブルと「部署マスタ」テーブルを「社員.部署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;
外部結合とは
外部結合は、基準となるテーブルを指定します。
どちらのテーブルを基準にするかを指定し、その基準となるテーブルに存在するレコードを抽出、基準ではないテーブルからは、結合条件に合致するレコードのみを抽出して結合します。
左外部結合(LEFT OUTER JOIN)
左側のテーブルを基準とするのが「左外部結合」(LEFT OUTER JOIN)です。
例えば、以下は「社員」テーブルと「部署マスタ」テーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で左外部結合した結果です。
左外部結合した結果、基準となる「社員」テーブルに存在するデータを抽出し、「部署マスタ」テーブルからは条件に一致したデータのみ抽出しています。
そのため、部署IDが「社員」テーブルにしか存在しない部署ID「4」のレコードは、「社員」テーブルの項目(カラム)である社員ID、社員名、部署IDしか設定されていません。(部署名はNULL)
左外部結合する場合は、SQLの「LEFT OUTER JOIN」を使用します。※OUTERは省略可能
■LEFT OUTER JOINを使った例
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は省略可能
■RIGHT OUTER JOINを使った例
SELECT
社員.社員ID, 社員.社員名, 部署マスタ.ID, 部署マスタ.部署名
FROM
社員 RIGHT OUTER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;
完全外部結合(FULL OUTER JOIN)
完全外部結合(FULL OUTER JOIN)は、両方のテーブルを基準とし、それぞれに一致しないレコードも抽出結果に含めます。
例えば、以下は「社員」テーブルと「部署マスタ」テーブルを「社員.部署ID = 部署マスタ.ID」の結合条件で完全外部結合した結果です。
「社員」テーブル、「部署マスタ」テーブルの両方のテーブルに存在するデータを抽出(部署IDが一致しないレコードも抽出対象に含める)しています。
完全外部結合する場合は、SQLの「FULL OUTER JOIN」を使用します。※OUTERは省略可能
■FULL OUTER JOINを使った例
SELECT
社員.社員ID, 社員.社員名, 社員.部署ID, 部署マスタ.部署名
FROM
社員 FULL OUTER JOIN 部署マスタ ON 社員.部署ID = 部署マスタ.ID;