ラーメンデータで学ぶ！SQL入門講座

## はじめに
初めまして。
ラーメンを愛してやまない新米エンジニアです。

今回は「ラーメンデータで学ぶ！SQL入門講座」ということで、
自分と同じSQL初学者のために、SQLの基本的な文法について、ラーメンデータベースを例に学んでいきましょう。
SQLをすでに勉強している、これから勉強しようと思っている方にぜひ読んでもらいたい内容となっております。

自分もまだSQLを勉強して日も浅く、学習した内容のアウトプットとしてこの記事を書かせていただきます。

## 目次
以下の内容が今回学ぶSQLの基本的な文法です。


1. SQLの基本コマンドの解説
2. SQLジョイン(内部結合と外部結合)の種類と使い方


## ラーメンデータベースの構造
今回は２つのテーブル①ラーメンテーブル②具材テーブルを使用します。

### ラーメンテーブル

| ラーメンID | ラーメンの名称   | スープ | 地域   | 価格 |
|------------|------------------|--------|--------|------|
| 1          | 醤油ラーメン     | 醤油   | 東京   | 800  |
| 2          | 味噌ラーメン     | 味噌   | 北海道 | 850  |
| 3          | とんこつラーメン | 豚骨   | 九州   | 900  |
| 4          | 塩ラーメン       | 塩     | 山形   | 750  |
| 5          | 家系ラーメン           | 醤油豚骨   |  神奈川  | 700  |


### 具材テーブル

| 具材ID | ラーメンID | 具材名       |
|--------|------------|--------------|
| 1      | 1          | チャーシュー |
| 2      | 1          | メンマ       |
| 3      | 2          | コーン       |
| 4      | NULL       | その他の具材 |


### 補足　---　列（カラム）、行（レコード）について
 - 列（カラム）  
 
テーブルの縦の部分で、特定の種類のデータを表します。
例: 「ラーメンID」, 「ラーメンの名称」, 「スープ」, 「地域」, 「価格」

 - 行（レコード）

テーブルの横の部分で、一連の関連データを表します。
例: 1行目はラーメンIDが1で、醤油ラーメン、スープが醤油、地域が東京、価格が800円のデータ


## 1. SQLの基本コマンドの解説

基本的なSQLコマンドについて、それぞれの使い方を解説します。
①SELECT
②INSERT　
③UPDATE
④DELETE

①SELECT：データの取得
 - 目的: データベースから特定のデータを選択して取得します。

 - 使用例:

    ①-1.すべてのラーメン情報を取得:
      ```.sql
      SELECT * FROM ラーメンテーブル;
      ```
      このクエリはラーメンテーブルのすべての列と行を取得します。

 - 想定される結果:
      
    | ラーメンID | ラーメンの名称   | スープ | 地域   | 価格 |
    |------------|------------------|--------|--------|------|
    | 1          | 醤油ラーメン     | 醤油   | 東京   | 800  |
    | 2          | 味噌ラーメン     | 味噌   | 北海道 | 850  |
    | 3          | とんこつラーメン | 豚骨   | 九州   | 900  |
    | 4          | 家系ラーメン     | 醤油豚骨    | 神奈川   | 700  |

      ①-2.特定の列のみを取得:
      ```.sql
      SELECT ラーメンの名称, 価格 FROM ラーメンテーブル;
      ```
      このクエリではラーメンの名称と価格のみを取得します。
      
 - 想定される結果:
    | ラーメンの名称   | 価格 |
    |------------------|------|
    | 醤油ラーメン     | 800  |
    | 味噌ラーメン     | 850  |
    | とんこつラーメン | 900  |
    | 塩ラーメン       | 750  |
    | 家系ラーメン     | 700  |

      
      ①-3.条件に一致するデータを取得:
      ```.sql
      SELECT * FROM ラーメンテーブル WHERE 価格 <= 800;
      ```
      ここでは価格が800円以下のラーメンのみを取得します。
      条件はWHERE句によって指定されます。


- 想定される結果:
    | ラーメンID | ラーメンの名称 | スープ   | 地域   | 価格 |
    |------------|----------------|----------|--------|------|
    | 1          | 醤油ラーメン   | 醤油     | 東京   | 800  |
    | 4          | 塩ラーメン     | 塩       | 山形   | 750  |
    | 5          | 家系ラーメン   | 醤油豚骨 | 神奈川 | 700  |

      WHERE句は、テーブルからデータを取得する際に特定の条件を指定し、
      条件に合致する行のみを選択するために使用されます。
      数値や文字列の比較、論理演算、範囲検索など、多様な条件指定を可能にします。
      

②INSERT：データの追加
 - 目的: データベースに新しいデータを追加します。
 -  使用例:
    
    新しいラーメン「鶏白湯ラーメン」を追加

    ```.sql
    INSERT INTO ラーメンテーブル (ラーメンの名称, スープ, 地域, 価格) VALUES ('鶏白湯ラーメン', '鶏白湯', '大阪', 950);
    ```

 - 想定される結果:

    | ラーメンID | ラーメンの名称   | スープ   | 地域   | 価格 |
    |------------|------------------|----------|--------|------|
    | 1          | 醤油ラーメン     | 醤油     | 東京   | 800  |
    | 2          | 味噌ラーメン     | 味噌     | 北海道 | 850  |
    | 3          | とんこつラーメン | 豚骨     | 九州   | 900  |
    | 4          | 塩ラーメン       | 塩       | 山形   | 750  |
    | 5          | 家系ラーメン     | 醤油豚骨 | 神奈川 | 700  |
    | 6          | 鶏白湯ラーメン   | 鶏白湯 | 大阪 | 950 |

    
③UPDATE：データの更新
 - 目的: データベースに新しいデータを更新します。
 -  使用例:
    
    塩ラーメンの価格を800円に変更

    ```.sql
    IUPDATE ラーメンテーブル SET 価格 = 800 WHERE ラーメンの名称 = '塩ラーメン';
    ```

 - 想定される結果:
    | ラーメンID | ラーメンの名称   | スープ   | 地域   | 価格 |
    |------------|------------------|----------|--------|------|
    | 1          | 醤油ラーメン     | 醤油     | 東京   | 800  |
    | 2          | 味噌ラーメン     | 味噌     | 北海道 | 850  |
    | 3          | とんこつラーメン | 豚骨     | 九州   | 900  |
    | 4          | 塩ラーメン       | 塩       | 山形   | 800  |
    | 5          | 家系ラーメン     | 醤油豚骨 | 神奈川 | 700  |

    
③DELETE：データの削除
 - 目的: データベースに新しいデータを削除します。
 -  使用例:
    
    家系ラーメンのデータを削除

    ```.sql
    DELETE FROM ラーメンテーブル WHERE ラーメンの名称 = '家系ラーメン';
    ```  


 - 想定される結果:
    | ラーメンID | ラーメンの名称   | スープ   | 地域   | 価格 |
    |------------|------------------|----------|--------|------|
    | 1          | 醤油ラーメン     | 醤油     | 東京   | 800  |
    | 2          | 味噌ラーメン     | 味噌     | 北海道 | 850  |
    | 3          | とんこつラーメン | 豚骨     | 九州   | 900  |
    | 4          | 塩ラーメン       | 塩       | 山形   | 750  |


## 2. SQLジョインの種類と使い方

SQLジョインは、異なるテーブル間で関連するデータを結合するために使用されます。
ジョインには複数の種類があり、それぞれ特定の状況に適しています。


INNER JOIN（内部結合）
 - 目的: 二つのテーブル間で共通のデータを結合します。
 - 使用例:

    ```.sql
    SELECT ラーメンテーブル.ラーメンの名称, 具材テーブル.具材名
    FROM ラーメンテーブル
    INNER JOIN 具材テーブル ON ラーメンテーブル.ラーメンID = 具材テーブル.ラーメンID;
    ```

 - 想定される結果:
    | ラーメンの名称   | 具材名       |
    |------------------|--------------|
    | 醤油ラーメン     | チャーシュー |
    | 醤油ラーメン     | メンマ       |
    | 味噌ラーメン     | コーン       |


LEFT JOIN（左外部結合）
 - 目的: 
左側のテーブルの全行と、右側のテーブルの一致する行を結合します。右側に一致する行がない場合は、結果はNULLになります。
 - 使用例:
    ```.sql
    SELECT ラーメンテーブル.ラーメンの名称, 具材テーブル.具材名
    FROM ラーメンテーブル
    LEFT JOIN 具材テーブル ON ラーメンテーブル.ラーメンID = 具材テーブル.ラーメンID;
    ```
 - 想定される結果:

 
    | ラーメンの名称   | 具材名       |
    |------------------|--------------|
    | 醤油ラーメン     | チャーシュー |
    | 醤油ラーメン     | メンマ       |
    | 味噌ラーメン     | コーン       |
    | とんこつラーメン | NULL         |
    | 塩ラーメン       | NULL         |
    | 家系ラーメン     | NULL         |

RIGHT JOIN（右外部結合）
 - 目的: 
右側のテーブルの全行と、左側のテーブルの一致する行を結合します。左側に一致する行がない場合は、結果はNULLになります。
 - 使用例:
    ```.sql
    SELECT ラーメンテーブル.ラーメンの名称, 具材テーブル.具材名
    FROM ラーメンテーブル
    RIGHT JOIN 具材テーブル ON ラーメンテーブル.ラーメンID = 具材テーブル.ラーメンID;
    ```
 - 想定される結果:

 
    | ラーメンの名称   | 具材名       |
    |------------------|--------------|
    | 醤油ラーメン     | チャーシュー |
    | 醤油ラーメン     | メンマ       |
    | 味噌ラーメン     | コーン       |
    | NULL             | その他の具材 |

FULL OUTER JOIN（全外部結合）
 - 目的: 
二つのテーブルの全行を結合します。一方のテーブルにのみ存在する行は、他方のテーブルの対応する列にNULLを持ちます。
 - 使用例:
    ```.sql
    SELECT ラーメンテーブル.ラーメンの名称, 具材テーブル.具材名
    FROM ラーメンテーブル
    FULL OUTER JOIN 具材テーブル ON ラーメンテーブル.ラーメンID = 具材テーブル.ラーメンID;
    ```
 - 想定される結果:

 
    | ラーメンの名称   | 具材名       |
    |------------------|--------------|
    | 醤油ラーメン     | チャーシュー |
    | 醤油ラーメン     | メンマ       |
    | 味噌ラーメン     | コーン       |
    | NULL             | その他の具材 |
    
 - この結合では、両テーブルのすべての行が表示され、一致する行がない場合はNULLが表示されます。
 - 具材テーブルに存在し、ラーメンテーブルに対応するデータがない「その他の具材」の行は、ラーメンの名称がNULLとなります。


 - 以上のジョインタイプは、異なるテーブル間の関連データを結合する際に非常に重要で、異なるデータソースからの情報を組み合わせて分析を行う際に広く使用されます。

## まとめ
 - この記事では、SQLの基本コマンドとジョインの種類について、ラーメンデータベースを用いて解説しました。
 - SQLの基本コマンド（SELECT、INSERT、UPDATE、DELETE）はデータベース操作の基礎を形成し、データの取得、追加、更新、削除を行うのに不可欠です。
 - また、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOINなどのジョインタイプは、異なるテーブル間で関連データを結合する上で重要な役割を果たします。
 - この記事が皆様のSQLの勉強に少しでも役立つことを願っております。