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

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

直積結合

pointこの用語のポイント

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

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

point両方のテーブルの全データを取り出すよ

pointすべての組み合わせでくっつけるよ

スポンサーリンク

簡単に書くよ

直積結合とは

「交差結合」の別の呼び名。
つまり

2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつで、両方のテーブルの全データを取り出して、すべての組み合わせでくっつけるやり方
です。

image piyo

詳しく書くよ

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

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

直積結合

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

取りあえず

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

と覚えてください。

さて、このテーブルですが、実は合体できます。
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です。

5つの合体のさせ方のうち

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

やり方を指す呼び名が「直積結合」です。
交差結合」や「クロス結合」と呼ばれる場合もあります。
実際のSQL(データベースとやり取りをするときに使う言葉)では「CROSS JOIN」と書きます。

それでは、先ほどの2つのテーブル

■1つ目のテーブル(テーブル1)
名前性別
ピヨ太
ピヨ子
ピヨ太ママ


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


を直積結合してみましょう。
テーブル1とテーブル2を合体して、新たに「名前」と「性別」と(「名前2」と)「年齢」があるテーブルを作るとします。

直積結合では、項目は気にしません。
無心になって、2つのテーブルのデータを、ひたすら、くっつけます。

まずはテーブル1の「名前」が「ピヨ太」のデータを見てください。
このテーブル1の「ピヨ太」のデータに、すべてのテーブル2のデータをくっつけます。

■1つ目のテーブル(テーブル1)
名前性別
ピヨ太
ピヨ子
ピヨ太ママ


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


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

■合体後のテーブル
名前性別名前2年齢
ピヨ太ピヨ太成人済み
ピヨ太ピヨ子永遠の17歳
ピヨ太ピヨ太パパおっさん


次にテーブル1の「名前」が「ピヨ子」のデータを見てください。
このテーブル1の「ピヨ子」のデータに、すべてのテーブル2のデータをくっつけます。

■1つ目のテーブル(テーブル1)
名前性別
ピヨ太
ピヨ子
ピヨ太ママ


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


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

■合体後のテーブル
名前性別名前2年齢
ピヨ太ピヨ太成人済み
ピヨ太ピヨ子永遠の17歳
ピヨ太ピヨ太パパおっさん
ピヨ子ピヨ太成人済み
ピヨ子ピヨ子永遠の17歳
ピヨ子ピヨ太パパおっさん


最後にテーブル1の「名前」が「ピヨ太ママ」のデータを見てください。
このテーブル1の「ピヨ太ママ」のデータに、すべてのテーブル2のデータをくっつけます。

■1つ目のテーブル(テーブル1)
名前性別
ピヨ太
ピヨ子
ピヨ太ママ


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


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

■合体後のテーブル
名前性別名前2年齢
ピヨ太ピヨ太成人済み
ピヨ太ピヨ子永遠の17歳
ピヨ太ピヨ太パパおっさん
ピヨ子ピヨ太成人済み
ピヨ子ピヨ子永遠の17歳
ピヨ子ピヨ太パパおっさん
ピヨ太ママピヨ太成人済み
ピヨ太ママピヨ子永遠の17歳
ピヨ太ママピヨ太パパおっさん


これで合体は終了です。
合体後のテーブルには、テーブル1とテーブル2のすべてのデータが、すべての組み合わせで入っています。

■合体後のテーブル
名前性別名前2年齢
ピヨ太ピヨ太成人済み
ピヨ太ピヨ子永遠の17歳
ピヨ太ピヨ太パパおっさん
ピヨ子ピヨ太成人済み
ピヨ子ピヨ子永遠の17歳
ピヨ子ピヨ太パパおっさん
ピヨ太ママピヨ太成人済み
ピヨ太ママピヨ子永遠の17歳
ピヨ太ママピヨ太パパおっさん


テーブル1には3行のデータがありました。
テーブル2にも3行のデータがありました。
合体後のテーブルには3行×3行で9行のデータが入ります。

このように、2つのテーブルの

1.全データを取り出して
2.すべての組み合わせでくっつける


合体のやり方が「直積結合」です。
実際のSQLでは、以下のように書きます。

SELECT
 【テーブル1】.【名前】
 ,【テーブル1】.【性別】
 ,【テーブル2】.【名前】
 ,【テーブル2】.【年齢】
FROM
 【テーブル1】
CROSS JOIN
 【テーブル2】


あるいは、データベースの種類によっては以下のようにも書けます。

SELECT
 【テーブル1】.【名前】
 ,【テーブル1】.【性別】
 ,【テーブル2】.【名前】
 ,【テーブル2】.【年齢】
FROM
 【テーブル1】,【テーブル2】


私は、きちんと「CROSS JOIN」って書きたい派ですけどね。
というか、そもそもの話として、直積結合自体を使いたくない派です。
どうしても直積結合を使う必要に迫られたら、直感的に分かりやすいとの理由で、しっかり「CROSS JOIN」と書くと思います。

なお

1.2つのテーブルの合体可能なデータのみ取り出す
2.テーブル1の全データを取り出して、それにテーブル2のデータをくっつける
3.テーブル2の全データを取り出して、それにテーブル1のデータをくっつける
4.両方のテーブルの全データを取り出して、くっつけられる範囲でくっつける
5.両方のテーブルの全データを取り出して、すべての組み合わせでくっつける


のうち、1は「内部結合(INNER JOIN)」と言います。
2は「左外部結合(LEFT OUTER JOIN)」です。
3は「右外部結合(RIGHT OUTER JOIN)」です。
4は「完全外部結合(FULL OUTER JOIN)」と言います。

まとめて書くと

1.2つのテーブルの合体可能なデータのみ取り出す(内部結合)
2.テーブル1の全データを取り出して、それにテーブル2のデータをくっつける(左外部結合)
3.テーブル2の全データを取り出して、それにテーブル1のデータをくっつける(右外部結合)
4.両方のテーブルの全データを取り出して、くっつけられる範囲でくっつける(完全外部結合)
5.両方のテーブルの全データを取り出して、すべての組み合わせでくっつける(直積結合)


です。

1を「内部結合」と呼ぶのと対比させて、2~4をまとめて「外部結合」と呼ぶ場合もあります。
5は特殊というか、あまり登場しないはずです。
少なくとも私は、お仕事で5を使ったことはありません。
性能面でもイマイチになりそうなので、5を使う必要に迫られたら、設計自体を見直すと思います。

せっかくなので、できれば全部まとめて覚えてあげてください。

image piyo2

一言でまとめるよ

まぁ「直積結合」って単語が出てきたら「2つのテーブルを合体させるやり方の1つで、全データを取り出して、すべての組み合わせで合体させるやり方なんだな~」と、お考えください。

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