自己結合
データベース関連で出てくるよ
2つのテーブルをくっつけて1つのテーブルっぽくするよ
実際に使うのは1つのテーブルだけど分身させて2つっぽくするよ
スポンサーリンク
簡単に書くよ
自己結合(読:ジコケツゴウ)とは
2つのテーブル
(データベースにおける実際にデータが入っている箱)をくっつけて1つのテーブルっぽくするときの やり方のひとつ
であり
まず1つのテーブルが分身して2つのテーブルっぽくなり、分身した自分同士が合体するやり方
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「データベース」と「テーブル」あとはテーブルの合体について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
データベースは「データを入れておく箱」です。
ただし「データベース」という用語は、実際には もう少し複雑な概念です。
データを入れておく箱そのものは「テーブル」と言います。
とりあえず
データベースの話において、実際にデータを入れておく箱がテーブル
と覚えてください。
さて、このテーブルですが、実は合体できます。
2つのテーブルをくっつけて、1つのテーブルっぽくできるのです。
例えば、そうですね。
以下の2つのテーブルが あったとしましょう。
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
1つ目のテーブル(テーブル1)には「名前」と「性別」があります。
2つ目のテーブル(テーブル2)には「名前」と「年齢」があります。
「名前」に注目すると、何となく合体できそうな気がしませんか?
実際問題、合体できます。
合体させることによって、例えば「名前」と「性別」と「年齢」があるテーブルを新たに作ったりできますよ。
このときの合体のさせ方には、いくつかのやり方があります。
一般的なのは
1.内部結合(INNER JOIN):2つのテーブルの合体可能なデータのみ取り出すやり方

2.左外部結合(LEFT OUTER JOIN):テーブル1の全データを取り出して、それにテーブル2のデータをくっつけるやり方

3.右外部結合(RIGHT OUTER JOIN):テーブル2の全データを取り出して、それにテーブル1のデータをくっつけるやり方

4.完全外部結合(FULL OUTER JOIN):両方のテーブルの全データを取り出して、くっつけられる範囲でくっつけるやり方

5.交差結合(CROSS JOIN):両方のテーブルの全データを取り出して、すべての組み合わせでくっつけるやり方

の5つです。
※それぞれの詳細は、ここでは書きません。必要に応じて「内部結合(INNER JOIN)」「左外部結合(LEFT OUTER JOIN)」「右外部結合(RIGHT OUTER JOIN)」「完全外部結合(FULL OUTER JOIN)」「交差結合(CROSS JOIN)」の説明を読んで情報を補完してください。
以上を踏まえて、本題に入ります。
ここまでに説明した5つの合体は
2つのテーブルを1つにする合体
です。
「2つのテーブル」を1つに合体です。
ただし、少し工夫すると、この「2つのテーブルを1つにする合体」を1つのテーブルでやれます。
どうやるか?
気合です。
……冗談です。
分身させます。
まず1つのテーブルを分身させて2つのテーブルにします。
2つのテーブルは姿かたち、中身に至るまで同じです。
ただし、テーブルの名前まで同じにすると区別ができません。
名前だけは別の名前(あだ名)を、それぞれ付けてあげます。

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

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

それでは、実際の自己結合の例を見てみましょう。
例えば、そうですね。
以下のテーブルが、ありました。
■分身前のテーブル
| 名前 | 趣味 | 好きな人 |
|---|---|---|
| ピヨ太 | 昼寝 | ピヨ子 |
| ピヨ子 | 食べ歩き | ピヨ太ママ |
| ピヨ太ママ | 料理 | ピヨ太 |
ピヨ太君、ピヨ子さん、ピヨ太ママの趣味と好きな人が書いてあります。
このテーブルから分かる情報は、ピヨ太君、ピヨ子さん、ピヨ太ママ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.【名前】
です。
一言でまとめるよ
まぁ「自己結合」って単語が出てきたら「1つのテーブル
(データベースにおける実際にデータが入っている箱)が分身して合体するテーブル結合のやり方なんだな~」と お考えください。






