オプショナリティとテーブル結合 (3)

前回の続きです。今回は、「任意 - 必須」の場合と「任意 - 任意」の場合について、サンプルデータを使って説明します。
前回: id:simply-k:20100819:1282156592

「任意 - 必須」の場合

ER図

次のようなER図に基づいてテーブルおよびリレーションシップを作成する場合を考えます。

社員テーブル
社員ID 氏名 部署ID
0001 鈴木 広 01
0002 佐藤 幸子 02
0003 山本 健二 02
0004 田中 優子 99
部署テーブル
部署ID 部署名
01 経理
02 営業
03 開発
99 所属なし
テーブル間のオプショナリティ
  • 部署テーブルの各レコードに対し、対応する社員テーブルのレコードが存在しない場合があります。 (多側:任意)
  • 社員テーブルの各レコードに対し、対応する部署テーブルのレコードが1つ存在します。 (1側:必須)
INNER JOIN / LEFT JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
0004 田中 優子 99 99 所属なし

INNER JOINとLEFT JOINは、同じ結果となります。

RIGHT JOIN / FULL JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
0004 田中 優子 99 99 所属なし
NULL NULL NULL 03 開発

RIGHT JOINとFULL JOINは、同じ結果となります。

「任意 - 任意」の場合

ER図

次のようなER図に基づいてテーブルおよびリレーションシップを作成する場合を考えます。

社員テーブル
社員ID 氏名 部署ID
0001 鈴木 広 01
0002 佐藤 幸子 02
0003 山本 健二 02
0004 田中 優子 NULL
部署テーブル
部署ID 部署名
01 経理
02 営業
03 開発
テーブル間のオプショナリティ
  • 部署テーブルの各レコードに対し、対応する社員テーブルのレコードが存在しない場合があります。 (多側:任意)
  • 社員テーブルの各レコードに対し、対応する部署テーブルのレコードが存在しない場合があります。 (1側:任意)
INNER JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
LEFT JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
0004 田中 優子 NULL NULL NULL
RIGHT JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
NULL NULL NULL 03 開発
FULL JOIN
社員ID 氏名 社員_部署ID 部署_部署ID 部署名
0001 鈴木 広 01 01 経理
0002 佐藤 幸子 02 02 営業
0003 山本 健二 02 02 営業
0004 田中 優子 NULL NULL NULL
NULL NULL NULL 03 開発

INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINは、全て違う結果となりました。「任意 - 任意」の場合は、これらの4種類のJOINの結果が、全て異なる可能性があります。(データによっては同じになる可能性もあります。)


「オプショナリティとテーブル結合」は、今回で終了です。
前回: id:simply-k:20100819:1282156592