MySQLの基本操作のまとめ①

SQLを使ったことがないので、勉強メモを残します。
使用環境

* windows10

* MySQL8.0.24

## 基本操作

* CREATE DATABASES:データベースの作成

* SHOW DATABASES：データベースの一覧表示

* CREATE TABLE：テーブル作成

* SHOW CREATE TABLE：テーブルの表示

* INSERT：テーブルにデータを挿入

* SELECT：テーブルからデータを取得

* UPDATE：データを上書き

* DELETE：データを削除

* ALTER:テーブルにカラムを追加

## CREATE DATABASES

まず、テーブルを作る前に「PRACTICE」という名前のDATABASEを作成。

```
CREATE DATABASE [データベース名];
```

実行結果

```
mysql> CREATE DATABASE PRACTICE;
Query OK, 1 row affected (0.02 sec)
```

## SHOW DATABASES
DATABASE一覧の表示。上記で作成した「practice」があることが確認できる。

```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| practice           |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)
```

## CREATE TABLE

1.まず使用するデータベースを選択する。これを選択しないとテーブルの作成ができない。

```
USE [データベース名];
```

実行結果

```
mysql> USE PRACTICE;
Database changed
```

2.テーブルを作成する。今回はオプション無しで作成する。

```
CREATE TABLE [テーブル名] (
    column1 [データ型] [その他オプション],
    column2 [データ型] [その他オプション],
    column3 [データ型] [その他オプション],
);
```

作成したのがこちらのTESTテーブル。

```
mysql> CREATE TABLE TEST(
    -> ID INTEGER,
    -> NAME TEXT,
    -> ENGLISH INTEGER,
    -> MATH INTEGER
    -> );
Query OK, 0 rows affected (0.07 sec)
```

## SHOW CREATE TABLE
前のCREATE TABLEで作成したテーブルを確認。

```
SHOW CREATE TABLE [テーブル名];
```

実行結果

```
mysql> SHOW CREATE TABLE TEST;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TEST  | CREATE TABLE `test` (
  `ID` int DEFAULT NULL,
  `NAME` text,
  `ENGLISH` int DEFAULT NULL,
  `MATH` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
```

## INSERT
指定したテーブルにデータを挿入する。

```
INSERT INTO [テーブル名] ([column1], [column2], [column3]) VALUES ([値1], [値2], [値3]); 
```

実行結果

```
mysql> INSERT INTO TEST (ID, NAME, ENGLISH, MATH) VALUES (1, 'RISA', 80, 90);
Query OK, 1 row affected (0.01 sec)
```

なお、以下のINSERT文（カラム指定なし）でもデータの挿入が可能。

```
mysql> INSERT INTO TEST VALUES (2, 'TARO', 75, 60);
Query OK, 1 row affected (0.01 sec)
```

## SELECT

```
SELECT * FROM [テーブル名];
```

先ほどINSERTしたデータを確認。挿入したデータが登録されていることが確認できる。

```
mysql> SELECT * FROM TEST;
+------+------+---------+------+
| ID   | NAME | ENGLISH | MATH |
+------+------+---------+------+
|    1 | RISA |      80 |   90 |
|    2 | TARO |      75 |   60 |
+------+------+---------+------+
2 rows in set (0.00 sec)
```

また、テーブルデータのカラムを指定して表示させる場合、以下の文で表示可能。

```
mysql> SELECT ID, NAME FROM TEST;
+------+------+
| ID   | NAME |
+------+------+
|    1 | RISA |
|    2 | TARO |
+------+------+
2 rows in set (0.00 sec)
```

条件付きで表示させる場合は、以下の文で表示可能。

```

mysql> SELECT * FROM TEST WHERE ID = 1;
+------+------+---------+------+
| ID   | NAME | ENGLISH | MATH |
+------+------+---------+------+
|    1 | RISA |      80 |   90 |
+------+------+---------+------+
1 row in set (0.00 sec)
```

## UPDATE

UPDATE文はデータを更新するので、元のデータは消えてしまう。
WHERE句を使わずにデータを更新しようとすると、全てのデータを上書きしてしまう可能性あり。
今回は NAME = RISA の ENGLISH を 0 に上書きする。

```
UPDATE [テーブル名] SET [colum1] = [値1], [colum2] = [値2], ... WHERE [条件式];
```

```
mysql> UPDATE TEST SET ENGLISH = 0 WHERE NAME = "RISA";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

更新ができているか確認のためSELECT文を実行。NAME = RISA の ENGLISH を 0 に上書きできた。

```
mysql> SELECT * FROM TEST;
+------+------+---------+------+
| ID   | NAME | ENGLISH | MATH |
+------+------+---------+------+
|    1 | RISA |       0 |   90 |
|    2 | TARO |      75 |   60 |
+------+------+---------+------+
2 rows in set (0.00 sec)
```

## DELETE
DELETE文は条件を指定しないと、テーブル中の全てのレコードを削除してしまう。以下のようにWHERE句を組み合わせて、条件に当てはまるレコードだけを選択削除する。

元のデータは以下。

```
mysql> SELECT * FROM TEST;
+------+-------+---------+------+
| ID   | NAME  | ENGLISH | MATH |
+------+-------+---------+------+
|    1 | RISA  |       0 |   90 |
|    2 | TARO  |      75 |   60 |
|    3 | RENA  |      65 |  100 |
|    4 | ASUKA |      80 |   80 |
+------+-------+---------+------+
4 rows in set (0.00 sec)
```

ここから ID = 4 のデータを削除する。

```
DELETE FROM [テーブル名] WHERE [条件式];
```

実行結果と確認のためSELECT文実行。ID = 4 のデータが削除されていることが確認できる。

```
mysql> DELETE FROM TEST WHERE ID = 4;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM TEST;
+------+------+---------+------+
| ID   | NAME | ENGLISH | MATH |
+------+------+---------+------+
|    1 | RISA |       0 |   90 |
|    2 | TARO |      75 |   60 |
|    3 | RENA |      65 |  100 |
+------+------+---------+------+
3 rows in set (0.01 sec)
```

レコードまるごとではなく、特定のカラムのデータのみ削除したい場合は、UPDATE文を使う。
「指定したカラムのデータをNULLに上書きする」といった処理を行う。NULLは「何もない」という意味を表す。

```
UPDATE [テーブル名] SET [column1] = NULL WHERE [条件式]
```

ID = 3 の NAME を NULL にする。

```
mysql> UPDATE TEST SET NAME = NULL WHERE ID = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM TEST;
+------+------+---------+------+
| ID   | NAME | ENGLISH | MATH |
+------+------+---------+------+
|    1 | RISA |       0 |   90 |
|    2 | TARO |      75 |   60 |
|    3 | NULL |      65 |  100 |
+------+------+---------+------+
3 rows in set (0.00 sec)
```

## ALTER
テーブルにカラムを追加する場合、以下のALTER文で追加可能。

```
ALTER TABLE [テーブル名] ADD [column] [データ型]
```

カラム名「SOCIETY」、データ型「INTEGER」の列を追加した結果が以下。
追加されたカラムにはNULLが入っている。

```
mysql> ALTER TABLE TEST ADD SOCIETY INTEGER;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM TEST;
+------+------+---------+------+---------+
| ID   | NAME | ENGLISH | MATH | SOCIETY |
+------+------+---------+------+---------+
|    1 | RISA |       0 |   90 |    NULL |
|    2 | TARO |      75 |   60 |    NULL |
|    3 | NULL |      65 |  100 |    NULL |
+------+------+---------+------+---------+
3 rows in set (0.00 sec)
```

### 参考文献
以下の文献を参考にさせていただきました。ありがとうございます。

https://qiita.com/takayuki-nakamura/items/dbb22b896bc344211089

https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706