【MySQL】試しにデータベースを作って色々いじってみた。

# なんで書いたの？
MySQLについて学習した内容をアウトプットする目的で、適当なデータベースを作って（DBeaverなどは使わず）ターミナル上でコマンド操作して色々いじってみました。

※見て頂くと検討つくと思うのですが、私は乃木坂46・日向坂46のファンです。が、ここで作ったものは架空のものですので、その点お含み置きください。

# 目次
1. AWSのRDSでMySQLサーバーを立ち上げる
2. AWS公式ドキュメントを元に、RDSで起動中のMySQLサーバーに管理者としてログイン
3. 下記内容をいじってみる

＜具体的には＞

- DBの作成
- DBの表示
- 使用するデータベースを選択
- テーブルの作成
- テーブルへレコードを挿入
- テーブルを表示
- テーブル名/インデックス名/カラム名を追加・変更
- 新しいカラムを追加した後に、追加したカラムを消去する
- 真偽値と登録日時をカラムとして追加してみる
- 後から主キー（Primary-key）を設定する
- AUTO_INCREMENTを追加する


##1. AWSのRDSでMySQLサーバーを立ち上げる
やったことはざっと下記の通り。

- 無料枠でMySQLのDBを作成
- マスタユーザー（＝管理者）の認証情報を入力（ユーザー名とパスワード）
- どのVPC（仮想ネットワーク）でRDSを実行させるか設定
- セキュリティグループで、「インバウンドのルールの編集」で、タイプ -> MySQL/Aurora、プロトコル -> TCP、ポート範囲　-> 3306、ソース -> 任意の場所,0.0.0.0/0, ::/0で設定（学習用のため任意の場所で設定）

##2. AWS公式ドキュメントを元に、RDSで起動中のMySQLサーバーに管理者としてログイン

[公式ドキュメントの「MySQL クライアントからの接続」](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)を参照し、適切なエンドポイントと、MySQLマスタユーザー（＝管理者）でコマンド操作

```terminal
mysql -h <endpoint> -P 3306 -u <mymasteruser> -p
```

すると、パスワードが求められるので、入力しログイン成功！

```terminal
USER:~ user$ mysql -h ****.rds.amazonaws.com -P 3306 -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql>
```

##3.下記のコマンドを試しにやってみる

###DBの作成

```sql

mysql> CREATE DATABASE HINATAZAKA_DB;
Query OK, 1 row affected (0.06 sec)
```

###DBの表示
```sql

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| HINATAZAKA_DB      |
| NOGIZAKA_DB        |
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
6 rows in set (0.05 sec)

```
###使用するデータベースを選択
※この操作を入れないと、テーブル・カラムを操作する時に``DBの名前.処理内容``といちいち書かないといけないのは面倒だと思い、調べてやってみた。

```sql

mysql> USE NOGIZAKA_DB;
Database changed
mysql> USE testdb ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
```

###テーブルの作成

```sql

mysql> CREATE TABLE blogs ( id int, name varchar(10));
Query OK, 0 rows affected (0.07 sec)
```

###テーブルへレコードを挿入

```sql

mysql> INSERT INTO blogs (id ,name) VALUES
    -> (1,"KAKI"),
    -> (2,"ASYU"),
    -> (3,"MATYU");
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM blogs;
+------+-------+
| id   | name  |
+------+-------+
|    1 | KAKI  |
|    2 | ASYU  |
|    3 | MATYU |
+------+-------+
3 rows in set (0.06 sec)
```

###テーブルを表示

```sql

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
```

###テーブル名/インデックス名/カラム名を追加・変更

```sql

mysql> ALTER TABLE blogs ADD watcher int;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)
```

###新しいカラムを追加した後に、追加したカラムを消去する

```sql

mysql> ALTER TABLE blogs ADD comments varchar(10);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| comments | varchar(10) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.05 sec)

mysql> ALTER TABLE blogs drop comments;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)
```

###真偽値と登録日時をカラムとして追加してみる

```sql

mysql> ALTER TABLE blogs ADD is_draft BOOL;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE blogs ADD created DATETIME;
Query OK, 0 rows affected (1.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| is_draft | tinyint(1)  | YES  |     | NULL    |       |
| created  | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.04 sec)

mysql> INSERT INTO blogs (id,name,watcher,is_draft,created) VALUES (5,"YUTTAN",40,TRUE,2020-10-10);
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> SELECT * FROM blogs;
+----+--------+---------+----------+---------------------+
| id | name   | watcher | is_draft | created             |
+----+--------+---------+----------+---------------------+
|  1 | KAKI   |    NULL |     NULL | NULL                |
|  2 | ASYU   |    NULL |     NULL | NULL                |
|  3 | MATYU  |    NULL |     NULL | NULL                |
|  5 | YUTTAN |      40 |        1 | 0000-00-00 00:00:00 |
+----+--------+---------+----------+---------------------+
4 rows in set (0.04 sec)

```

###後から主キー（Primary-key）を設定する

```sql

mysql> ALTER TABLE blogs ADD PRIMARY KEY(id);
Query OK, 3 rows affected (0.08 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| is_draft | tinyint(1)  | YES  |     | NULL    |       |
| created  | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.03 sec)
```

###AUTO_INCREMENTを追加する

```sql

mysql> ALTER TABLE blogs MODIFY id INT AUTO_INCREMENT ;
Query OK, 3 rows affected (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | YES  |     | NULL    |                |
| watcher  | int         | YES  |     | NULL    |                |
| is_draft | tinyint(1)  | YES  |     | NULL    |                |
| created  | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.04 sec)

```

#最後に
DBeaver・MySQLWorkbenchなどDBクライアントを使うと圧倒的に早くSQLを書き、挙動もすぐに確認できるメリットを痛感しました。ただ、全然書いたことがない人が、いきなりそれに手を出すと、エラーに対して適切に原因を調査して書き直すというスキルが身につきにくいかな？？と感じました。

もっともっとやれることがたくさんあります（集計関数・結合など）が、その部分も一通り学習できたタイミングでアウトプットとして載せていけたらと思います＾＾


# 参考
[MySQL データベースエンジンを実行している DB インスタンスに接続する:MySQL クライアントからの接続](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)

[MariaDB データベースエンジンを実行している DB インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToMariaDBInstance.html)

[使用するデータベースを選択する(USE文)](https://www.dbonline.jp/mysql/database/index3.html#section1)

[テーブル構造を変更する(ALTER TABLE文)](https://www.dbonline.jp/mysql/table/index18.html#section3)

[主キーの設定・削除、AUTO_ICREMENT属性の設定](https://phpjavascriptroom.com/?t=mysql&p=autoincerment)

[PRIMARY KEY制約(主キー/プライマリキーを設定する)](https://www.dbonline.jp/mysql/table/index8.html#section1)

[テーブル定義を変更するSQL](https://www.projectgroup.info/tips/SQLServer/SQL/SQL000005.html)