個人的な備忘録：MySQLでユーザーを作成し、権限を付与する方法について記事としてアウトプットしてみた

## はじめに
この記事では、MySQLでユーザーを作成し、権限を付与する方法 について、SQL文を検証しながら解説します。

:::note info
**これからSQLの基礎を学びたい方や、簡単に環境を構築して気軽に試したい方に向けた内容です。**
:::

また、本記事は個人的な備忘録としてまとめたものです。***その点をご理解いただければ幸いです。***

## 書こうと思ったきっかけ
私は、テーブル設計やSQLについて、技術書を読んで体系的に学んだわけではありません。

:::note warn
***とにかく手を動かし、試行錯誤しながら基礎を身につけてきました。***
:::

この経験を踏まえ、今回は SQLの基本を整理し、体系的に振り返りながら 記事としてアウトプットしていきます。

## 事前準備
手軽にSQL文を試す方法として、今回は Docker Hub を活用し、SQLコマンドの技術検証を行います。

📌 **詳しい手順については、過去の記事にまとめていますので、こちらを参考にしてください。**

https://qiita.com/free-honda/items/222e17d909b4507b93c2#2-docker-hub%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3

また、本記事では 事前にデータベースが作成されていることを前提 に進めていきます。***まだデータベースを作成していない方は、以下の記事を参考にしてください。***

https://qiita.com/free-honda/items/eed6e5ee16d18d0d66f2

https://qiita.com/free-honda/items/c0696b9e6d202cbb6577

https://qiita.com/free-honda/items/87752b798bdd5fab102e

## 実際にやってみた
MySQLでは、データベースに新しいユーザーを作成し、特定の権限を付与 することができます。

### ユーザーを作成する

```sql
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password123';
```

**実行結果**

```sql
mysql> CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password123';
Query OK, 0 rows affected (0.02 sec)
```

**解説**
- `'new_user'@'localhost'` → `new_user` というユーザーを **ローカル接続（localhost）** 用に作成。
- `'password123'` → `new_user` のパスワードを設定（任意の強力なパスワードに変更してください）。

**リモート接続を許可したい場合**
`'localhost'` の部分を `'%'` に変更すると、どこからでもアクセス可能になります。

```sql
CREATE USER 'new_user'@'%' IDENTIFIED BY 'password123';
```

### ユーザーに権限を付与する

```sql
GRANT ALL PRIVILEGES ON my_database.* TO 'new_user'@'localhost';
```

**解説**
- `ALL PRIVILEGES` → `new_user` に **すべての権限** を付与。  
- `my_database.*` → `my_database` 内の **すべてのテーブル** に適用。  
- `'new_user'@'localhost'` → `new_user` に対して **ローカル接続** で適用。  

**特定の権限だけを付与したい場合**

```sql
GRANT SELECT, INSERT, UPDATE, DELETE ON my_database.* TO 'new_user'@'localhost';
```

このSQLでは、データの 参照（SELECT）、追加（INSERT）、更新（UPDATE）、削除（DELETE） のみを許可しています。

### 権限を適用する
MySQLの権限を即時適用するには、以下を実行します。

```sql
FLUSH PRIVILEGES;
```

**実行結果**

```sql
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected, 1 warning (0.01 sec)
```

### 付与した権限を確認する

```sql
SHOW GRANTS FOR 'new_user'@'localhost';
```

**実行結果**

```sql
mysql> SHOW GRANTS FOR 'new_user'@'localhost';
+----------------------------------------------+
| Grants for new_user@localhost                |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `new_user`@`localhost` |
+----------------------------------------------+
1 row in set (0.00 sec)
```

### ユーザーを削除する
作成したユーザーを削除する場合は、以下のSQLを実行します。

```sql
DROP USER 'new_user'@'localhost';
```

**実行結果**

```sql
mysql> DROP USER 'new_user'@'localhost';
Query OK, 0 rows affected (0.01 sec)
```

アカウントが削除されたため、ログインできないことを確認できます。

```sql
➜  ~ docker exec -it my-mysql mysql -u new_user -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'new_user'@'localhost' (using password: YES)
```

### **コマンド一覧**

| コマンド | 説明 |
|----------|------|
| `CREATE USER 'user'@'host' IDENTIFIED BY 'password';` | ユーザーの作成 |
| `GRANT 権限 ON データベース.* TO 'user'@'host';` | 権限を付与 |
| `FLUSH PRIVILEGES;` | 権限の適用 |
| `SHOW GRANTS FOR 'user'@'host';` | 付与された権限を確認 |
| `DROP USER 'user'@'host';` | ユーザーの削除 |


## まとめ
本記事では、MySQLでユーザーを作成し、権限を付与する方法 について紹介しました。

:::note warn
***SQLを学ぶ上で、ユーザー作成やアカウント権限の管理を正しく理解し、適切に使い分けることが重要です。***
:::

今後も、**基本的なSQLの知識をしっかりと定着** させていきたいと思います。