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

今回はSQLにおける``テーブルの結合``について説明していきたいと思います！！
### 過去の関連投稿
「[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")」
「[SQLの基礎について学ぶ＃０９](https://qiita.com/TAISEI-050523/items/95df4fc700c1251f187f "Qiita")」

## 1. テーブル結合の構文
```SQL
SELECT 選択列リスト         /* 選択列リストには両テーブルの列を指定 */
 FROM テーブルA
 JOIN テーブルB           /* ２つのテーブルを結合 */
   ON 両テーブルの結合条件
```
例えば以下の``①new_accountテーブル``に``② nameテーブル``の内容を結合して、``日付``,``項目名``,``メモ``の列を含んだ表を作成します。
###① 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         |
###② namesテーブル
|    id    |    name（項目名）     |
|:-----------:|:------------:|
| 1 |　食費  　 | 
| 2 |　交通費 　 |
| 3 |　日用品  　 |
###結合するためのSQL文
```SQL
SELECT date, name AS expense_item, memo       /* 選択列リストには両テーブルの列を指定 */
 FROM account
 JOIN names                                   /* ２つのテーブルを結合 */
   ON account.name_id = names.id             
```      
``JOIN句``によって以下を実施
▶ ``accountテーブル``と``namesテーブル``が結合されて、namesテーブルの「id」「name」の列が参照できる。
``on 結合条件``によって以下を実施
▶ ``accountテーブル``の各行について、``name_id（項目名ID）列のデータ``に注目する。
▶ それと等しい``id``を持つ``namesテーブルの行``を取り出してつなぐ。
▶ 結合の際に、DBMS内部で以下のSQL文が繰り返されている。

```SQL
SELECT * FROM names 
 WHERE /* account.name_idの値 */ = names.id
```
###結果
|    date    |    expense_item    |  memo  |
|:-----------:|:------------:|:------------:|
| 2020-12-03 |　食費  　 | カフェでランチ|
| 2021-01-03 |　交通費　 |地下鉄を使用|
| 2021-05-22 |　食費  　 |レストランで夕食|
| 2021-03-14 |　日用品  　 |トイレットペーパー、洗剤|
###結合とは
 結合とは、テーブルを単純にまるごと繋ぐことではなく、``結合条件で満たされた行を１つひとつ繋ぐこと``である。

##2. テーブルの結合に関する様々な構文
###① ２つのテーブル両方に同じ名前のカラムが存在する場合(「memo」の名前のカラムが互いに存在)
```SQL
SELECT date, account.memo, names.memo          /* 属するテーブル名を明示 */
 FROM account
 JOIN names           
   ON account.name_id = names.id
```
###② 別名を使ったSQL文
```SQL
SELECT date, A.memo, N.memo          /* 属するテーブル名の別名を明示 */
 FROM account AS A                   /* accountテーブルに別名Aを設定 */
 JOIN names AS N                     /* namesテーブルに別名Nを設定 */       
   ON A.name_id = N.id               /* 属するテーブル名の別名を明示 */
```
###③ ３つ以上のテーブルの結合
```SQL
SELECT date, user.name, names.name  /* userテーブルのnameとnamesテーブルのnameを取得 */
 FROM account                 
 JOIN user                          /* userテーブルと結合 */
   ON account.user_id = user.id
 JOIN names                         /* namesテーブルと結合 */       
   ON account.name_id = names.id   
```
###③ 副問合せの結果との結合
```SQL
SELECT date, name AS expense_item, price   
 FROM account                 
 JOIN (SELECT * FROM names
       WHERE name IN ('食費', '交通費'))    /* 名前が「食費」「交通費」の行だけ習得 */
       AS names                              
   ON account.name_id = names.id   
```
##3. まとめ
　今回は以上になります。また何か間違い等ありましたら、コメントお願いします。