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

2.テーブル1の全データを取り出して、それにテーブル2のデータをくっつける

3.テーブル2の全データを取り出して、それにテーブル1のデータをくっつける

4.両方のテーブルの全データを取り出して、くっつけられる範囲でくっつける

5.両方のテーブルの全データを取り出して、すべての組み合わせでくっつける

の5つです。
よく登場するのは1と2ですけどね。
3は2を逆にしただけなので、あまり使いません。
3を使いたいときはテーブルの順番を入れ替えて2を使います。
4はデータベースの種類によっては、使えなかったりします。
5は特殊なので、ひとまず忘れてください。
以上を踏まえて、5つの合体のさせ方のうち
1.2つのテーブルの合体可能なデータのみ取り出す
やり方を指す呼び名が「内部結合」です。
実際のSQL(データベースと やり取りするときに使う言葉)では「INNER JOIN」と書きます。

それでは、先ほどの2つのテーブル
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
を「名前」に注目して内部結合してみましょう。
テーブル1とテーブル2を合体して、新たに「名前」と「性別」と「年齢」があるテーブルを作るとします。
まずは「名前」が「ピヨ太」のデータを見てください。
テーブル1にもテーブル2にも「名前」が「ピヨ太」のデータがあります。
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
ふむ、これなら「名前」と「性別」と「年齢」が揃いますね。
くっつけて合体後のテーブルに入れてしまいましょう。
■合体後のテーブル
| 名前 | 性別 | 年齢 |
|---|---|---|
| ピヨ太 | 男 | 成人済み |
次に「名前」が「ピヨ子」のデータを見てください。
テーブル1にもテーブル2にも「名前」が「ピヨ子」のデータがあります。
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
ふむ、これも「名前」と「性別」と「年齢」が揃いますね。
くっつけて合体後のテーブルに入れてしまいましょう。
■合体後のテーブル
| 名前 | 性別 | 年齢 |
|---|---|---|
| ピヨ太 | 男 | 成人済み |
| ピヨ子 | 女 | 永遠の17歳 |
次に、テーブル1の「名前」が「ピヨ太ママ」のデータを見てください。
「名前」が「ピヨ太ママ」のデータは、テーブル2には ありません。
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
ふむ、これでは「名前」と「性別」と「年齢」が揃いませんね。
無視しましょう。
合体後のテーブルは、そのままです。
■合体後のテーブル
| 名前 | 性別 | 年齢 |
|---|---|---|
| ピヨ太 | 男 | 成人済み |
| ピヨ子 | 女 | 永遠の17歳 |
最後に、テーブル2の「名前」が「ピヨ太パパ」のデータを見てください。
「名前」が「ピヨ太パパ」のデータは、テーブル1には ありません。
■1つ目のテーブル(テーブル1)
| 名前 | 性別 |
|---|---|
| ピヨ太 | 男 |
| ピヨ子 | 女 |
| ピヨ太ママ | 女 |
■2つ目のテーブル(テーブル2)
| 名前 | 年齢 |
|---|---|
| ピヨ太 | 成人済み |
| ピヨ子 | 永遠の17歳 |
| ピヨ太パパ | おっさん |
ふむ、これでは「名前」と「性別」と「年齢」が揃いませんね。
無視しましょう。
合体後のテーブルは、そのままです。
■合体後のテーブル
| 名前 | 性別 | 年齢 |
|---|---|---|
| ピヨ太 | 男 | 成人済み |
| ピヨ子 | 女 | 永遠の17歳 |
これで合体は終了です。
「名前」と「性別」と「年齢」がある合体後のテーブルには、くっつけることができた「ピヨ太」と「ピヨ子」のデータのみ入っています。
■合体後のテーブル
| 名前 | 性別 | 年齢 |
|---|---|---|
| ピヨ太 | 男 | 成人済み |
| ピヨ子 | 女 | 永遠の17歳 |
このように、2つのテーブルの合体可能なデータのみを抜き出して合体させるやり方が「内部結合」です。
実際のSQLでは、以下のように書きます。
SELECT
【テーブル1】.【名前】
,【テーブル1】.【性別】
,【テーブル2】.【年齢】
FROM
【テーブル1】
INNER JOIN
【テーブル2】
ON
【テーブル1】.【名前】 = 【テーブル2】.【名前】
なお
1.2つのテーブルの合体可能なデータのみ取り出す
2.テーブル1の全データを取り出して、それにテーブル2のデータをくっつける
3.テーブル2の全データを取り出して、それにテーブル1のデータをくっつける
4.両方のテーブルの全データを取り出して、くっつけられる範囲でくっつける
5.両方のテーブルの全データを取り出して、すべての組み合わせでくっつける
のうち、2は「左外部結合(LEFT OUTER JOIN)」と言います。
3は「右外部結合(RIGHT OUTER JOIN)」です。
4は「完全外部結合(FULL OUTER JOIN)」です。
5は「交差結合(CROSS JOIN)」と言います。
まとめて書くと
1.2つのテーブルの合体可能なデータのみ取り出す(内部結合)
2.テーブル1の全データを取り出して、それにテーブル2のデータをくっつける(左外部結合)
3.テーブル2の全データを取り出して、それにテーブル1のデータをくっつける(右外部結合)
4.両方のテーブルの全データを取り出して、くっつけられる範囲でくっつける(完全外部結合)
5.両方のテーブルの全データを取り出して、すべての組み合わせでくっつける(交差結合)
です。

1を「内部結合」と呼ぶのと対比させて、2~4をまとめて「外部結合」と呼ぶ場合も あります。
5は特殊というか、あまり登場しないはずです。
少なくとも私は、お仕事で5を使ったことは ありません。
性能面でもイマイチになりそうなので、5を使う必要に迫られたら、設計自体を見直すと思います。
せっかくなので、できれば全部まとめて覚えてあげてください。
一言でまとめるよ
まぁ「内部結合」って単語が出てきたら「2つのテーブル
(データベースにおける実際にデータが入っている箱)を合体させるやり方のひとつで、合体可能なデータのみを取り出すやり方なんだな~」と お考えください。






