SQL入門

## はじめに
これからSQLを触る人向けに、SQLの基礎をまとめていくよ。今回記載する内容は、
* テーブルの作成
* SQLの基礎（SELECT、JOIN、UNION、UPDATE、DELETEなど）

この辺りを中心にまとめていくよ。

## SQL基礎
今回利用するテーブルは以下の3つだよ。

`student1`
| id | name | club_id |
|:-:|:-:|:-:|
　|   |   |   |

 `student2`
| id | name | club_id |
|:-:|:-:|:-:|
　|   |   |   |

 `club`
 | id | club_name |
|:-:|:-:|
　|   |   |



### テーブル作成
テーブルを作成するには、`CREATE TABLE`を使うよ。
 ```
CREATE TABLE テーブル名 (列名1 データ型, 列名2 データ型, 列名3 データ型, ……);
 ```
実際に使ってみるよ。上記の3つのテーブルは以下のSQLで作成するよ。
```sql
CREATE TABLE student1 (id int, name varchar(255), club_id int);
CREATE TABLE student2 (id int, name varchar(255), club_id int);
CREATE TABLE club (id int, club_name varchar(255));
```


### データ投入
さっき作ったテーブルにデータを投入していくよ。データ投入には`INSERT INTO`を使うよ。列名を指定する場合（カラムの順番関係なく、特定のカラムにデータを投入したい場合）はテーブル名の後に列名を指定するよ。
```
INSERT INTO テーブル名 (列名1, 列名2, ……) VALUES (値1, 値2, ……);
```
では実際にコードを書くよ。ここではstudent１、student2、clubテーブルを作成するよ。`student1`、`student2`テーブルは列名を指定して、`club`テーブルは列名を指定せずデータを投入するよ。
```sql
INSERT INTO student1 (id, name, club_id) 
VALUES (1, 'Qiita Taro', 1), (2, 'Qiita Jiro', 2), (3, 'Qiita Saburo', 1);

INSERT INTO student2 (id, club_id, name) 
VALUES (1, 3, 'Qiita Shiro'), (2, 2, 'Qiita Goro');

INSERT INTO club 
VALUES (1, 'baseball'), (2, 'soccer'), (3, 'tennis');
```

そうするとこんな感じにデータが投入されているよ。
`student1`
| id | name | club_id |
|:-:|:-:|:-:|
１　| Qiita Taro | 1 |
2 | Qiita Jiro | 2 |
3 | Qiita Saburo | 1

`student2`
| id | name | club_id |
|:-:|:-:|:-:|
１　| Qiita Shiro | 3 |
2 | Qiita Goro | 2 |

`club`
| id | club_name |
|:-:|:-:|
1 | baseball |
2 | soccer |
3 | tennis |

### データ取得
先ほどデータを投入したテーブルからデータを取得するよ。データの取得には`SELECT`を使うよ。
```
SELECT 取得したい列名（全て取得したい場合は＊）　FROM テーブル名;
```
では実際に使っていくよ。今回はstudent1テーブルから`id`と`name`を取得するよ。
```sql
SELECT id,name FROM student1;
```
取得結果はこうだよ。
| id | name |
|:-:|:-:|
１　| Qiita Taro |
2 | Qiita Jiro |
3 | Qiita Saburo

また、`id=1`のデータだけ取得したい場合は`WHERE`を使うよ。
```
SELECT 取得したい列名（全て取得したい場合は＊）　FROM テーブル名 WHERE 条件式;
```

実際に使ってみるよ。今回はWHEREでid=1を指定してデータを取得するよ。
```sql
SELECT * FROM student1 WHERE id = 1;
```
取得結果はこんな感じ。
| id | name | club_id |
|:-:|:-:|:-:|
１　| Qiita Taro | 1 |

### テーブル結合
次に`student1`と`club`テーブルを結合して、`student1`から`id`と`name`を、`club`テーブルから`club_name`を取得するよ。テーブル結合は`JOIN`を使うよ。`JOIN`にはいろいろ種類があるけど、ここではよく使われる`INNER JOIN`を使うよ。
```
SELECT テーブル名.列名, テーブル名.列名 ... FROM テーブル名1 INNER JOIN テーブル名2 ON 条件式;
```
実際に使っていくよ。
```sql
SELECT student1.id, student1.name, club.club_name 
FROM student1 
INNER JOIN club ON student1.club_id = club.id;
```
取得結果はこんな感じ。
| id | name | club_name |
|:-:|:-:|:-:|
１　| Qiita Taro | baseball |
2 | Qiita Jiro | soccer 
3 | Qiita Saburo | baseball

### データ更新
データの更新には`UPDATE`を用いるよ。
```
UPDATE テーブル名 SET 列名=値 WHERE 条件;
```
ここでは、student1テーブルの`Qiita Saburo`が`野球部`から`サッカー部`に転部したとするよ。そして、部活動が変更出来たかを`SELECT`文で確認するよ。
```sql
// データ更新
UPDATE student1 SET club_id = 2 WHERE id = 3;

// データ確認
SELECT student1.id, student2.name, club.club_nam 
FROM student1 
INNER JOIN club ON student1.club_id = club.id;
```
取得結果はこんな感じ。
| id | name | club_name |
|:-:|:-:|:-:|
1 | Qiita Taro | baseball |
2 | Qiita Jiro | soccer 
3 | Qiita Saburo | soccer

### 取得データの結合
`UNION`は複数のテーブルから得たデータを結合することができるよ。
`UNION ALL`と`UNION`があるけど、構文は基本的に同じでだよ。
違いは、
* `UNION`：重複した行を除いて表示
* `UNION ALL`：重複した行もすべて表示
* だよ。
構文は次の通り。
```
SELECT 列名 FROM テーブル名1 UNION SELECT 列名 FROM テーブル名2;
```
今回はテーブル`student1`と`student2`のテーブルからサッカー部のメンバーを取得し結合するよ。
```sql
SELECT student1.name, club.club_name 
FROM student1 
INNER JOIN club ON student1.club_id = club.id 
WHERE student1.club_id = 2 
UNION
SELECT student2.name, club.club_name 
FROM student2 
INNER JOIN club ON student2.club_id = club.id 
WHERE student2.club_id = 2 
```
取得結果はこんな感じ。
| name | club_name |
|:-:|:-:|
Qiita Jiro | soccer 
Qiita Saburo | soccer 
Qiita Goro | soccer

### データ削除
最後に、データの削除は`DELETE`を使うよ。`DELETE`は`WHERE句`を書かないと、`テーブルの全レコードが削除`されてしまうので注意が必要だよ。
```
DELETE FROM テーブル名 WHERE 条件;
```
今回は`student1`テーブルから`Qiita Saburo`を削除するよ。
```sql
// データ削除
DELETE FROM student1 WHERE id = 3;
// データ確認
SELECT * FROM student1;
```
| id | name | club_id |
|:-:|:-:|:-:|
１　| Qiita Taro | 1 |
2 | Qiita Jiro | 2 |

このようにしっかりデータが削除されたことがわかるね。
ちなみに、`WHERE句`を指定しないと、以下のようにデータがすべて消えるよ（テーブルは削除されない。テーブルごと削除したい場合は`DROP TABLE テーブル名`）。
| id | name | club_id |
|:-:|:-:|:-:|
　|   |   |   |

 ## まとめ
 SQLの基本的な操作をまとめたよ。これである程度はSQLを使うことができるよ。
まだまだSQLを自在に使いこなすのは難しい、、、。