茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

データベース:結合

■ 結合

  • 正規化されたテーブルでは、必要なデータが分割されている場合が多い。

そこでデータを必要な形で取り出す為に、結合を使用する。


内部結合(Inner Join)

  • 特に指定しない限りは、結合は、内部結合である。

以下の社員テーブルを参考に説明する。

[社員]

社員番号 氏名 上司社員番号
0001 ホムペ太郎
0002 ブログ次郎 0001
0003 ソシャ三郎 0001
0004 チャト花子 0002

まずは条件指定をせずに結合をしてみる。

SELECT * FROM 社員 AS A, 社員 AS B;

[直積]

A.社員番号 A.氏名 A.上司社員番号 B.社員番号 B.氏名 B.上司社員番号
0001 ホムペ太郎   0001 ホムペ太郎  
0001 ホムペ太郎   0002 ブログ次郎 0001
0001 ホムペ太郎   0003 ソシャ三郎 0001
0001 ホムペ太郎   0004 チャト花子 0002
0002 ブログ次郎 0001 0001 ホムペ太郎  
0002 ブログ次郎 0001 0002 ブログ次郎 0001
0002 ブログ次郎 0001 0003 ソシャ三郎 0001
0002 ブログ次郎 0001 0004 チャト花子 0002
0003 ソシャ三郎 0001 0001 ホムペ太郎  
0003 ソシャ三郎 0001 0002 ブログ次郎 0001
0003 ソシャ三郎 0001 0003 ソシャ三郎 0001
0003 ソシャ三郎 0001 0004 チャト花子 0002
0004 チャト花子 0002 0001 ホムペ太郎  
0004 チャト花子 0002 0002 ブログ次郎 0001
0004 チャト花子 0002 0003 ソシャ三郎 0001
0004 チャト花子 0002 0004 チャト花子 0002

列数: (A+B)、行数: (A*B)となる。


次に、条件を指定して結合してみる。

SELECT * FROM 社員 AS A, 社員 AS B
WHERE A.上司社員番号 = B.社員番号;

[直積+選択]

A.社員番号 A.氏名 A.上司社員番号 B.社員番号 B.氏名 B.上司社員番号
0002 ブログ次郎 0001 0001 ホムペ太郎  
0003 ソシャ三郎 0001 0001 ホムペ太郎  
0004 チャト花子 0002 0002 ブログ次郎 0001

内部結合なので、テーブルAの上司社員番号がNULLの行は取り出されない。


次に、射影も追加して条件を指定して結合してみる。

SELECT A.社員番号 AS 社員番号,A.氏名 AS 氏名,B.氏名 AS 上司氏名
FROM 社員 AS A, 社員 AS B
WHERE A.上司社員番号 = B.社員番号;

[直積+選択+射影]

社員番号 氏名 上司氏名
0002 ブログ次郎 ホムペ太郎
0003 ソシャ三郎 ホムペ太郎
0004 チャト花子 ブログ次郎

同じテーブル同士を結合する事を、自己結合という。


外部結合(Outer Join)

  • 外部結合には、左外部結合と、右外部結合がある。

一般的には、左外部結合を使用する。

以下の社員テーブルを参考に説明する。

[社員]

社員番号 氏名 上司社員番号
0001 ホムペ太郎  
0002 ブログ次郎 0001
0003 ソシャ三郎 0001
0004 チャト花子 0002
SELECT A.社員番号 AS 社員番号,A.氏名 AS 氏名,B.氏名 AS 上司氏名
FROM 社員 AS A LEFT JOIN 社員 AS B ON A.上司社員番号 = B.社員番号;

[左外部結合]

社員番号 氏名 上司氏名
0001 ホムペ太郎    ←表Aの上司社員番号に値がないが取り出される
0002 ブログ次郎 ホムペ太郎
0003 ソシャ三郎 ホムペ太郎
0004 チャト花子 ブログ次郎

一方のテーブルの全行を対象とし、結合を行うことが外部結合の使用される理由である。


【試験対策】

  • 結合には、内部結合と、外部結合がある。
  • 内部結合は、ある共通の列の値一致をもって結合する。
  • 外部結合を使う理由:結合する一方の表に値のないデータを取り出すことが出来るから。

目次へ戻る