データベース講習会 ~実践編~

# データベース講習会 ~実践編~
最近、ほとんどプログラミングの経験がない後輩に講習会をする機会があったので、その後輩向けの資料をなんとなくまとめました。本当に基礎の基礎しかまとめていないので、これからプログラミングを勉強する初学者向けの記事として読んでください。

## 関連
- [データベース講習会 ~基礎編~](https://qiita.com/ReAL1341/items/9bb4981fa2c7ecd8590c)

## MySQLのインストール
- 基本利用が無料なので、今回はDBMSとしてMySQLを使っていきます。
- 下のサイトを参考にしてMySQLをインストールしましょう。
    - [Windows](https://prog-8.com/docs/mysql-env-win)
    - [Mac](https://prog-8.com/docs/mysql-env)
- インストールに関しては自己責任でお願いします。


## RDBを操作してみる
### データベースの作成
- まずコンソール（コマンドプロンプト）からMySQLにログインすると、画面に色々文字が出てきて、次の行で文字が止まると思います。
```SQL
mysql>
```

- データベースを作成するためには次のように入力してください。
    - セミコロン（;）を忘れずに！！セミコロン（;）はクエリの終了を表すため、これを忘れると動きません。
    - ``practice``はデータベース名なので、好きな名前に置き換えて大丈夫です。
    - 大文字・小文字の区別はありませんが、DBMSによってあらかじめ決められた文言は大文字、テーブル名やカラム名などユーザーが決めるものは小文字で書くことが多いです。（見やすさのため）
```SQL
CREATE DATABASE practice;
/*
CREATE DATABASE [データベース名]
*/
```

- データベースの一覧を確認するためには次のように入力してください。
```SQL
SHOW databases;
```

- 作成したデータベースを使うためには次のように入力してください。せっかくデータベースを作成しても、これをしないとデータベースを使えません。
```SQL
USE practice;
```


### テーブルの作成
- 次にテーブルを作成してみます。次のように入力してください。
    - ``users``はテーブル名、``id``、``name``、``age``はカラム名です。
    - ``VARCHAR``や``INT``はカラム型と言い、そのカラムに入るデータのデータ型を指定します。``VARCHAR``は文字列、``INT``は整数です。他にもたくさんあるので調べてみてください。
        - ``VARCHAR``の後ろにある``255``は最大文字数を表します。数字は適当に選んでください。
    - ``PRIMARY KEY``は主キーとなるカラムを指定しています。主キーについては後程説明します。
    - ``DEFAULT CHARSET``は文字コードを指定しています。日本語を利用する場合は、文字化けしないように``utf8``に指定しましょう。
```SQL
CREATE TABLE users(id INT, name VARCHAR(255), age INT, PRIMARY KEY(id)) DEFAULT CHARSET=utf8;
/*
CREATE TABLE [テーブル名]([カラム名1] [カラム型1], [カラム名2] [カラム型2], ・・・, PRIMARY KEY([主キーのカラム名]));
*/
```

- テーブルの一覧を確認するためには次のように入力してください。
```SQL
SHOW tables;
```


### 主キー（PRIMARY KEY）
- **主キー**とは、レコードを一意に特定するためのカラムです。
- 例えば何らかの名簿についてのデータベースがあったときに、「名前」、「性別」、「年齢」というカラムだけだと、同性同年齢で同姓同名の二人がいたときに識別することができません。
- このとき、新たに「id」というカラムを設けることで、この二人を識別することができます。このときの「id」カラムのことを主キー（PRIMARY KEY）と言います。
- そのため、主キーは重複が許されません。
- 主キーとなるカラムは、テーブルを作成するときに設定できます。具体的なクエリについては「テーブルの作成」を見てください。


## RDBでデータを扱ってみる
### データの挿入
- データを挿入するためには次のように入力してください。
```SQL
INSERT INTO users VALUES(1, 'Mike', 20);
INSERT INTO users VALUES(2, 'Alice', 19);
INSERT INTO users VALUES(3, 'Bob', 21);
/*
INSERT INTO [テーブル名] VALUES([カラム1の値],[カラム2の値],・・・);
*/
```


### データの取得
- データを取得するには次のように入力してください。
```SQL
SELECT name, age FROM users;
/*
SELECT [取得したいカラム1], [取得したいカラム2],・・・ FROM [テーブル名];
*/
```
```
+-------+------+
| name  | age  |
+-------+------+
| Mike  |   20 |
| Alice |   19 |
| Bob   |   21 |
+-------+------+
```
- すべてのカラムを取得したい場合は次のように入力してください。
```SQL
SELECT * FROM users;
/*
SELECT * FROM [テーブル名];
*/
```
```
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | Mike  |   20 |
|  2 | Alice |   19 |
|  3 | Bob   |   21 |
+----+-------+------+
```

- 条件を指定したい場合は次のように入力してください。
    - 条件式は等号・不等号以外にもたくさんあるので調べてみてください。
```SQL
SELECT * FROM users WHERE id = 2;
SELECT name,age FROM users WHERE age >= 20;
/*
SELECT [取得したいカラム1], [取得したいカラム2],・・・ FROM [テーブル名] WHERE [条件式];
SELECT * FROM [テーブル名] WHERE [条件式];
*/
```
```
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  2 | Alice |   19 |
+----+-------+------+
```
```
+------+------+
| name | age  |
+------+------+
| Mike |   20 |
| Bob  |   21 |
+------+------+
```

### データの更新
- データを更新するには次のように入力してください。
```SQL
UPDATE users SET age = 20 WHERE id = 2;
/*
UPDATE [テーブル名] SET [更新するカラム名1] = [値1], [更新するカラム名2] = [値2],・・・ WHERE [条件式];
*/
```
- 更新したデータを確認してみましょう。
```SQL
SELECT * FROM users;
```
```
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | Mike  |   20 |
|  2 | Alice |   20 |
|  3 | Bob   |   21 |
+----+-------+------+
```


### データの削除
- データを削除するには次のように入力してください。
```SQL
DELETE FROM users WHERE id = 3;
/*
DELETE FROM [テーブル名] WHERE [条件式];
*/
```
- 削除したデータを確認してみましょう。
```SQL
SELECT * FROM users;
```
```
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | Mike  |   20 |
|  2 | Alice |   20 |
+----+-------+------+
```

- また、次のように入力するとデータをすべて削除することができます。
```SQL
DELETE FROM users;
/*
DELETE FROM [テーブル名];
*/
```


## オートインクリメント（AUTO INCREMENT）
- 「データの挿入」において、主キーである``id``カラムの値を「1、2、3」と手動で書いていましたが、実際のサービスは何万というデータを扱うため、手動で書くのは現実的ではありません。
- そこで、DBMSに用意されている自動採番機能を用います。MySQLに用意されている自動採番機能を**オートインクリメント**と言います。オートインクリメントは主キーに設定されることが多いです。
- オートインクリメントを設定するために一度テーブルを作り直します。下のように入力して、既存の``users``テーブルを削除してください。
```SQL
DROP TABLE users;
/*
DROP TABLE [テーブル名];
*/
```
- 下のように入力して、``id``カラムにオートインクリメントを設定したテーブルを作成してください。
    - オートインクリメントはカラム型の後ろに``AUTO_INCREMENT``を付けるだけで設定できます。原則1テーブルに1カラムしか設定できません。
```SQL
CREATE TABLE users(id INT AUTO_INCREMENT, name VARCHAR(255), age INT, PRIMARY KEY(id)) DEFAULT CHARSET=utf8;
```
- 試しにデータを挿入してみて、オートインクリメントが機能しているか確かめてみましょう。オートインクリメントに値を挿入したくないので、先ほどとは少し異なる書き方になります。
    - ``id``カラムに``0``を挿入することで、自動で採番されます。
    - また、挿入するカラムを指定してオートインクリメントが設定されたカラムに値を挿入しないことで、自動採番することも可能です。
```SQL
INSERT INTO users VALUES(0, 'Mike', 20);
INSERT INTO users(name, age) VALUES('Alice', 19);
/*
INSERT INTO users([挿入するカラム名1], [挿入するカラム名2],・・・) VALUES([値1], [値2],・・・);
*/
```
- 挿入されたデータを確認してみましょう。
```SQL
SELECT * FROM users;
```
```
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | Mike  |   20 |
|  2 | Alice |   19 |
+----+-------+------+
```

## 終わりに
今回は実際にMySQLを用いてデータを扱う方法を記事にしました。次回はLaravelでデータベースを扱う方法について記事にしようと思います。