SCROLL

年賀状のやり取りで学ぶデータベースの結合について

明けましておめでとうございます!
TechFun ITスクールです。
今年もどうぞよろしくお願いいたします。

さて、1月といえばお正月。
お正月といえば年賀状。
最近は、はがきを出すこともめっきり減りましたが、届いた年賀状を見て「あ、この人には出してないや」「今年もこの人から届いたなぁ」などと、家族で盛り上がった方も多いのではないでしょうか。

ところで、「この人から年賀状もらったけど、私からは出してないなぁ」というのは、どのように判断していますか?

おそらく、無意識のうちに頭の中で「年賀状を出した人リスト」と「年賀状をもらった人リスト」を比較しているかと思います。
この操作をデータベースを使って表現することを「結合」といい、「JOIN」というキーワードを使用します。

以下のようなテーブルを使って考えてみましょう。

<年賀状を送った人テーブル(以下:送ったテーブル)>

名前 住所
田中 太郎 東京都千代田区
山田 花子 東京都中央区
鈴木 次郎 埼玉県さいたま市
佐藤 ももこ 千葉県船橋市
山下 健太 埼玉県川口市

<年賀状をもらった人テーブル(以下:もらったテーブル)>

名前 住所
田中 太郎 東京都千代田区
川田 まりこ 東京都中央区
佐藤 ももこ 千葉県船橋市
山下 健太 埼玉県川口市
林 幸子 千葉県浦安市

※話を簡単にするために、同姓同名=同一人物とし、住所が同じでも名前が違えば別人とします。
※実際の業務では電話番号などのほかの情報や管理用の通し番号などを含むことが多いですが、話を簡単にするために、名前と住所だけで説明を進めていきます。

「私も送ったし、相手からももらった」場合は、「送ったテーブル」と「もらったテーブル」の両方に同じ名前があるはずです。
これをSQLで表現するとこのようになります。

SELECT * FROM 送ったテーブル INNER JOIN もらったテーブル ON 送ったテーブル.名前 = もらったテーブル.名前;

ポイントは「INNER JOIN」です。
これは「内部結合」ともいい、テーブルの特定の列が一致するデータだけを抽出します。
今回は、特定の列を「名前」としており、これは「ON句」で表現しています。
そして、内部結合後のテーブルは以下のようになります。

<年賀状を送った&もらったテーブル>

名前 住所 名前 住所
田中 太郎 東京都千代田区 田中 太郎 東京都千代田区
佐藤 ももこ 千葉県船橋市 佐藤 ももこ 千葉県船橋市
山下 健太 埼玉県川口市 山下 健太 埼玉県川口市

SQLにおいてJOIN(結合)は、左から右に向かってテーブルを順にくっつけていきます。
そのため内部結合後のテーブルは「送ったテーブル」(ヘッダーが薄いブルーの部分)が左側にあります。

では次に、「私は年賀状を出したが、相手からはもらっていない」場合を考えてみましょう。
この場合は、「送ったテーブル」にだけ名前があるはずです(=もらってないので、「もらったテーブル」にデータは存在しない)。
これをSQLで表現するとこのようになります。

SELECT * FROM 送ったテーブル LEFT JOIN もらったテーブル ON 送ったテーブル.名前 = もらったテーブル.名前;

ここでのポイントは「LEFT JOIN」です。
結合後のテーブルは以下のようになります。

<私は送ったけど相手からはもらってないテーブル>

名前 住所 名前 住所
田中 太郎 東京都千代田区 田中 太郎 東京都千代田区
山田 花子 東京都中央区
鈴木 次郎 埼玉県さいたま市
佐藤 ももこ 千葉県船橋市 佐藤 ももこ 千葉県船橋市
山下 健太 埼玉県川口市 山下 健太 埼玉県川口市

「LEFT JOIN」は、「左側のテーブルのデータはすべて抽出するよ!」という性質を持った結合です。
前述した通り、JOINは左から順にテーブルをくっつけていくので、「送ったテーブル」が左側になります。
「名前」が同じデータ かつ 「送ったテーブル」の全データを抽出した結果、上記のように、山田花子さんと鈴木次郎さん(からは年賀状をもらってないので、)空っぽとなります。

最後に「私は送ってないが、相手からはもらった」場合を考えてみましょう。
この場合は「もらったテーブル」にだけ名前があるはずです。
SQLで表現するとこのようになります。

SELECT * FROM 送ったテーブル RIGHT JOIN もらったテーブル ON 送ったテーブル.名前 = もらったテーブル.名前;

結合後のテーブルは次の通りです。

<私は送ってないけど相手からはもらったテーブル>

名前 住所 名前 住所
田中 太郎 東京都千代田区 田中 太郎 東京都千代田区
川田 まりこ 東京都中央区
佐藤 ももこ 千葉県船橋市 佐藤 ももこ 千葉県船橋市
山下 健太 埼玉県川口市 山下 健太 埼玉県川口市
林 幸子 千葉県浦安市

今度は「RIGHT JOIN」を使用していますので、LEFT JOINとは逆に右側のテーブルのデータをすべて抽出します。
その他の動きはLEFT JOINのときと同じです。
川田まりこさんと林幸子さんが、「送ったテーブル」で空欄になっていることから、川田まりこさんと林幸子さんには年賀状を出していないことが分かりました。

このように、「結合」と一口に言っても、上記のようにINNER JOIN / LEFT JOIN / RIGHT JOINと(少なくとも)3種類の方法があります。
そのため、どんなデータを抽出したいのかによって、適切に使い分ける必要があります。
また、抽出されるデータを事前にイメージしておくことが、結合を使い分けるポイントの1つでもあります。

TechFun ITスクールでは、文法やロジックはもちろん、実践的な考え方なども指導しています。
研修に興味を持たれた方は、ぜひお問い合わせフォームからお問い合わせください。

新入社員・新人などの未経験者を
即戦力Javaエンジニアへ育成!

資料ダウンロード
研修の内容や進め方について詳細を解説しています
お問い合わせ
通常2営業日以内に、担当者より回答いたします

お知らせ

お知らせ一覧を見る