[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

自己結合

pointこの用語のポイント

pointデータベース関連で出てくるよ

point2つのテーブルをくっつけて1つのテーブルっぽくするよ

point実際に使うのは1つのテーブルだけど分身させて2つっぽくするよ

スポンサーリンク

簡単に書くよ

自己結合とは

2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつで、まず1つのテーブルが分身して2つのテーブルっぽくなり、分身した自分同士が合体するやり方
です。

image piyo

詳しく書くよ

順番に見ていきましょう。

データベースは「データを入れておく箱」ね。

自己結合

ただし「データベース」という用語は、実際には、もう少し複雑な概念です。
データを入れておく箱そのものは「テーブル」と言います。

取りあえず

データベース関連で出てくる用語で、実際にデータを入れておく箱が「テーブル」

と覚えてください。

さて、このテーブルですが、実は合体できます。
2つのテーブルをくっつけて、1つのテーブルっぽくできるのです。

例えば、そうですね。

以下の2つのテーブルがあったとしましょう。

■1つ目のテーブル(テーブル1)

名前性別
ピヨ太
ピヨ子
ピヨ太ママ


■2つ目のテーブル(テーブル2)
名前年齢
ピヨ太成人済み
ピヨ子永遠の17歳
ピヨ太パパおっさん


1つ目のテーブル(テーブル1)には「名前」と「性別」があります。
2つ目のテーブル(テーブル2)には「名前」と「年齢」があります。

「名前」に注目すると、何となく合体できそうな気がしませんか?

実際問題、合体できます。
合体させることによって、例えば「名前」と「性別」と「年齢」があるテーブルを新たに作ったりできますよ。

このときの合体のさせ方には、いくつかのやり方があります。
一般的なのは

1.内部結合(INNER JOIN)
2.左外部結合(LEFT OUTER JOIN)
3.右外部結合(RIGHT OUTER JOIN)
4.完全外部結合(FULL OUTER JOIN)
5.交差結合(CROSS JOIN)


の5つです。

それぞれの詳細は長くなるので、ここでは書きません。
興味がある方は、用語「内部結合(INNER JOIN)」「左外部結合(LEFT OUTER JOIN)」「右外部結合(RIGHT OUTER JOIN)」「完全外部結合(FULL OUTER JOIN)」「交差結合(CROSS JOIN)」の説明を、ご覧ください。

さて、これらの合体は

2つのテーブルを1つにする合体

です。
「2つのテーブル」を1つに合体です。

ただし、少し工夫すると、この「2つのテーブルを1つにする合体」を1つのテーブルでやれます。

どうやるか?

気合です。

……冗談です。
分身させます。

まず1つのテーブルを分身させて2つのテーブルにします。
2つのテーブルは姿かたち、中身に至るまで同じです。
ただし、テーブルの名前まで同じにすると区別ができません。
名前だけは別の名前(あだ名)を、それぞれ付けてあげます。

自己結合2

そして、分身した2つのテーブルを合体させるのです。

自己結合3

これで、テーブルが1つでも合体できます。
このような「1つのテーブルを分身させて合体するテーブル結合のやり方」が「自己結合」です。

自己結合4

それでは、実際の自己結合の例を見てみましょう。

例えば、そうですね。
以下のテーブルが、ありました。

■分身前のテーブル
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


ピヨ太君、ピヨ子さん、ピヨ太ママの趣味と好きな人が書いてあります。

このテーブルから分かる情報は、ピヨ太君、ピヨ子さん、ピヨ太ママ3人分の名前と趣味と好きな人だけでしょうか?

違います。
ちょっと工夫をすると、もう1つ分かります。

それは

好きな人の趣味

です。

まず、先ほどのテーブルを分身させて2つにします。
分身なのでテーブルの中身は同じです。

■分身後のテーブル1
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


■分身後のテーブル2
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


次に、分身後のテーブル1にある「好きな人」と分身後のテーブル2にある「名前」を紐付けます。
そうすると、合体後のテーブルとして「名前」「趣味」「好きな人」「好きな人の趣味」の4つの項目を持つテーブルを作れるのです。

順番にやってみましょう。

分身後のテーブル1の「名前」が「ピヨ太」のデータを見てください。
「好きな人」は「ピヨ子」です。
これに分身後のテーブル2の「名前」が「ピヨ子」のデータをくっつけてみましょう。
そうすると、ピヨ子さんの趣味、つまり、ピヨ太君の好きな人の趣味が分かります。

■分身後のテーブル1
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


■分身後のテーブル2
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


合体後のテーブルは以下のようになります。

■合体後のテーブル
名前趣味好きな人好きな人の趣味
ピヨ太昼寝ピヨ子食べ歩き


次に分身後のテーブル1の「名前」が「ピヨ子」のデータを見てください。
「好きな人」は「ピヨ太ママ」です。
これに分身後のテーブル2の「名前」が「ピヨ太ママ」のデータをくっつけてみましょう。
そうすると、ピヨ太ママの趣味、つまり、ピヨ子さんの好きな人の趣味が分かります。

■分身後のテーブル1
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


■分身後のテーブル2
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


合体後のテーブルは以下のようになります。

■合体後のテーブル
名前趣味好きな人好きな人の趣味
ピヨ太昼寝ピヨ子食べ歩き
ピヨ子食べ歩きピヨ太ママ料理


最後に分身後のテーブル1の「名前」が「ピヨ太ママ」のデータを見てください。
「好きな人」は「ピヨ太」です。
これに分身後のテーブル2の「名前」が「ピヨ太」のデータをくっつけてみましょう。
そうすると、ピヨ太君の趣味、つまり、ピヨ太ママの好きな人の趣味が分かります。

■分身後のテーブル1
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


■分身後のテーブル2
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


合体後のテーブルは以下のようになります。

■合体後のテーブル
名前趣味好きな人好きな人の趣味
ピヨ太昼寝ピヨ子食べ歩き
ピヨ子食べ歩きピヨ太ママ料理
ピヨ太ママ料理ピヨ太昼寝


これで合体は終了です。
分身前のテーブルに「好きな人の趣味」が追加されたテーブルが、できあがりました。

■分身前のテーブル
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太


■合体後のテーブル
名前趣味好きな人好きな人の趣味
ピヨ太昼寝ピヨ子食べ歩き
ピヨ子食べ歩きピヨ太ママ料理
ピヨ太ママ料理ピヨ太昼寝


使ったテーブルは、元をただせば「分身前のテーブル」の1つだけです。
ですが、分身させることによって2つのテーブルっぽくして「2つのテーブルを1つにする合体」をしました。

このような、テーブルを分身させて自分同士を合体させるやり方が自己結合です。
結合の種類は問いません。
内部結合でも外部結合でも、分身した自分同士を合体させていれば、自己結合と呼びます。

なお、実際のSQL(データベースとやり取りをするときに使う言葉)では、例えば以下のように書きます。

SELECT
 t1.【名前】
 ,t1.【趣味】
 ,t1.【好きな人】
 ,t2.【趣味】 as 好きな人の趣味
FROM
 【分身前のテーブル】 t1
INNER JOIN
 【分身前のテーブル】 t2
ON
 t1.【好きな人】 = t2.【名前】


簡単に解説しておきますね。

分身後のテーブル1に、あだ名「t1」を付けています。

【分身前のテーブル】 t1

の部分です。

分身後のテーブル2に、あだ名「t2」を付けています。

【分身前のテーブル】 t2

の部分です。

分身後のテーブル1の「好きな人」に分身後のテーブル2の「名前」を紐付けることで、テーブルを合体させています。

FROM
 【分身前のテーブル】 t1
INNER JOIN
 【分身前のテーブル】 t2
ON
 t1.【好きな人】 = t2.【名前】


の部分です。

分身後のテーブル2の「趣味」は、テーブル1を基準にして見れば「好きな人の趣味」と言えます。
「分身後のテーブル2の『趣味』」ではなく「好きな人の趣味」と呼ぶことにしましょう。

,t2.【趣味】 as 好きな人の趣味

の部分です。

ということで、上で長々と書いた

■分身前のテーブル
名前趣味好きな人
ピヨ太昼寝ピヨ子
ピヨ子食べ歩きピヨ太ママ
ピヨ太ママ料理ピヨ太




■合体後のテーブル
名前趣味好きな人好きな人の趣味
ピヨ太昼寝ピヨ子食べ歩き
ピヨ子食べ歩きピヨ太ママ料理
ピヨ太ママ料理ピヨ太昼寝


にする処理を実際のSQLで書いたのが

SELECT
 t1.【名前】
 ,t1.【趣味】
 ,t1.【好きな人】
 ,t2.【趣味】 as 好きな人の趣味
FROM
 【分身前のテーブル】 t1
INNER JOIN
 【分身前のテーブル】 t2
ON
 t1.【好きな人】 = t2.【名前】


です。

image piyo2

一言でまとめるよ

まぁ「自己結合」って単語が出てきたら「1つのテーブルが分身して合体するテーブル結合のやり方なんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク