SQLの基礎について学ぶ＃０９

　今回はSQLにおける``複数テーブルの結合``について説明していきたいと思います！！<b>複数テーブルの結合</b>を用いることで、``複数テーブルに分けて格納したデータを同時に取り出す``ことができ、データベースの力を最大化することができます。
### 過去の関連投稿
「[SQLの基礎について学ぶ＃０１](https://qiita.com/TAISEI-050523/items/31dd74cd386fe4dc46bf "Qiita")」
「[SQLの基礎について学ぶ＃０２](https://qiita.com/TAISEI-050523/items/75265fba015879bd3bf8 "Qiita")」
「[SQLの基礎について学ぶ＃０３](https://qiita.com/TAISEI-050523/items/2d87b30fa3de353af159 "Qiita")」
「[SQLの基礎について学ぶ＃０４](https://qiita.com/TAISEI-050523/items/6c4509276613d5eee488 "Qiita")」
「[SQLの基礎について学ぶ＃０５](https://qiita.com/TAISEI-050523/items/845bbdd046e28b443090 "Qiita")」
「[SQLの基礎について学ぶ＃０６](https://qiita.com/TAISEI-050523/items/bd9effcebe1b0ced652c "Qiita")」
「[SQLの基礎について学ぶ＃０７](https://qiita.com/TAISEI-050523/items/92254021e478309e0d15 "Qiita")」
「[SQLの基礎について学ぶ＃０８](https://qiita.com/TAISEI-050523/items/0665dbdacf5c5eaac974 "Qiita")」

## 1. 複数テーブルへのデータの格納
### accountテーブル
|    date（日付）    |    name（項目名）     |  memo(メモ)  |    price（金額）     |
|:-----------:|:------------:|:------------:|:------------:|
| 2020-12-03 |　食費  　 | カフェでランチ|800         |
| 2021-01-03 |　交通費 　 |地下鉄を使用| 600         |
| 2021-05-22 |　食費  　 |レストランで夕食| 1000         |
| 2021-03-14 |　日用品  　 |トイレットペーパー、洗剤| 1400         |
このテーブルを以下のように、<b>複数テーブル</b>(今回は２つのテーブル)に分けます！！
　　　　　　　　　　　　⬇⬇⬇
　　　　　　　　　　　　⬇⬇⬇
###① new_accountテーブル
|    date（日付）    |    name_id（項目名ID）     |  memo(メモ)  |    price（金額）     |
|:-----------:|:------------:|:------------:|:------------:|
| 2020-12-03 |　1  　 | カフェでランチ|800         |
| 2021-01-03 |　2　 |地下鉄を使用| 600         |
| 2021-05-22 |　1  　 |レストランで夕食| 1000         |
| 2021-03-14 |　3  　 |トイレットペーパー、洗剤| 1400         |
###② nameテーブル
|    id    |    name（項目名）     |  remarks(項目名の備考)  |
|:-----------:|:------------:|:------------:|
| 1 |　食費  　 | 食事代（交際費に関わる食事代は除く）|
| 2 |　交通費 　 |電車、バス、飛行機等|
| 3 |　日用品  　 |日常で使用する消耗品|              

　``new_accountテーブル``では項目名がなくなり、代わりに``name_id(項目名ID)``が付与されました。これが何を意味するかというと、分割して新しくできた``nameテーブル``の``id``に対応します。つまり、``項目名ID``には、``nameテーブル``の``id列``のいずれかが格納されており、「項目名は別テーブルであるnameテーブルを参照して下さい」ということになります。

　``new_accountテーブル``で、``nameテーブル``の``id``を指定することによって、``nameテーブル``のどの行を指しているのか明確に指定することができます。

今回の``new_accountテーブル``と``nameテーブル``のように、ある２つのテーブルの行に情報として関連性がある場合、その関連性を``リレーションシップ``と呼びます。また``new_accountテーブル``の``name_id``のように、他のテーブルの関連する行を指定するための値を格納することで、リレーションシップの役割を担う列のことを``外部キー``と呼びます。


##2. 複数テーブルに分けるメリット
　accountテーブルから複数テーブルである``new_accountテーブル``で、``nameテーブル``に分けたことで、人間にとっては見づらく、不便になったように感じます。
　しかし、コンピューターにとっては、このように複数テーブルに分割されていたほうが、データを``安全``、``確実``、``高速``にデータを取り扱えるというメリットがあります。
　また、内容に重複が多く分かりにくい表になってしまうことを防ぐメリットもあります。例えば、``nameテーブル``のremarksでは項目名に対しての備考が記載されています。もし、``new_accoutテーブル``と``nameテーブル``を１つにまとめると以下のようになります。

|    date（日付）      |    name（項目名）     |  remarks(項目名の備考)  |  memo(メモ)  |    price（金額）     |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 2020-12-03  |　食費  　 | 食事代（交際費に関わる食事代は除く）|カフェでランチ|800         |
| 2021-01-03 |　交通費 　 |電車、バス、飛行機等|地下鉄を使用| 600         |
| 2021-05-22  |　食費  　 | 食事代（交際費に関わる食事代は除く）|レストランで夕食| 1000         |
| 2021-03-14 |　日用品  　 |日常で使用する消耗品|トイレットペーパー、洗剤| 1400         |
 
　このように、項目名が食費である行の備考が重複してしまいます。この表では、そこまで気にならないかもしれませんが。膨大なデータになると同じ備考が``繰り返し記載``されることになり、``見づらい表``になってしまします。１つのテーブルに様々な情報を盛り込むことは、``データ管理を難しく``してしまいます。


##3. リレーショナルデータベース
　複数テーブルを利用するこにはメリットがありますが、このままでは、人間が見づらいテーブルの構成になってしまいます。これを改善するために、私達が普段利用する多くのデータベース製品には、``管理に適した構成の複数のテーブルを結合して、人間が理解しやすい構成の表を得る``機能を有しています。このようなデータベースを特に``リレーショナルデータベース``と呼び、その機能の中枢を担うDBMSを``RDBMS``と呼びます。

##3. まとめ
① ある２つのテーブルの行に情報として関連性がある場合、その関連性を``リレーションシップ``と呼ぶ。
② リレーションシップの役割を担う列のことを``外部キー``と呼ぶ。
③ データを複数テーブルに分けることで、データを``安全``、``確実``、``高速``に取り扱うことができる。
④ RDBは、データを``複数テーブル``で``安全``、``確実``に管理する。
⑤ RDBは、必要に応じて``データを結合``して、人間が理解できる表を作成する。

　今回は以上になります。次回はどのように``データを結合``するのかを学習していきたいと思います。また何か間違い等ありましたら、コメントお願いします。