GitのCodeSpacesを使ってMySQLをざっくり学ぶ①　DBの作成／削除／切替・ユーザーの作成・SQLファイル実行

# MySQLについて

本記事はMySQLについて学習する初学者向けの記事となります。
ちなみにGithubのアカウントが既に登録されている前提で進んでいきますのでご注意ください。

まずこのMySQLというものが何かから説明していきます。

### MySQL
…オープンソースのリレーショナルデータベース管理システム（RDBMS）のことです。
　テーブルの作成・削除、レコードの作成・更新・削除など、様々な操作が可能です。
 　多様なプラットフォームに対応しており、Windows、Linux、MacOSなど
  　様々なOS上で動作します。
   　小規模プロジェクト～大規模なシステムで幅広く利用されています。

## 前提
まず、今回の学習環境は下記のようになります。
・Git CodeSpaces
・MySQL（Ver 8.0.40-0）

### Git CodeSpaces使用方法
…クラウドベースの開発環境です。ローカル環境を使用しなくてよいので容量を温存しておくことができます。Live Share機能というものがあり、VSCode等のテキストエディタと同様に扱うことができるなどの利点があります。
機能詳細につきましては下記公式サイトをご確認ください。基本的に有料ですが、制限付きで無料での使用が可能です。（ただ月単位で使用時間が決定されているため注意が必要です）
（https://github.co.jp/features/codespaces）

今回はこのCodeSpacesを使用してMySQLを学んでいこうと思います。
まず新規リポジトリを作成します。左にある「New」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/01d5d35e-efc1-fdfe-9cb3-1693206e7b99.png)

するとこの画面に遷移しますので、作成するリポジトリ名や他設定を行いましょう。
今回はリポジトリ名&非公開&READMEファイルの追加を設定して他はデフォルトで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/a34c4c80-cb73-9384-8833-bdef412668b4.png)


右下の「Create repository」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/245852cf-b42f-ef91-a774-7aa266eddbaf.png)

最終的にこの状態になっていれば問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/ddb31055-5fb6-3cb1-7d19-3fe792ec9d43.png)


次に右上にある「code」ボタンを押下してポップアップを表示し、
「Create codespace on main」ボタンを押下します。

![codespaces_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/355fb686-7a95-bc08-b9f1-f158966f5080.gif)


しばらくするとこのようにVSCodeのようなエディタ画面が表示されます。
これでCodeSpacesの準備ができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/e5acc398-7837-9678-454b-62206f0be015.png)

この画像では画面下部分にすでにターミナルが開かれていますが、もしターミナルが開いていない状態で画面が表示された場合は、左上のメニューから新しいターミナルを開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906686/5120aa1f-69bd-72e3-4bdb-97c3cc307aee.png)

次にMySQLのインストールを行います。

### MySQLインストール方法
現在Git CodeSpacesが使用できる状況であり、ターミナルが開かれているという前提で進んでいきます。

①まず、システムのパッケージリストを最新の状態に更新します。
このコマンドを実行することで、最新のパッケージ情報を取得し、インストールできる最新バージョンのパッケージを確認できるようになります。（「$」はすでに表示されているはずですので、それ以降を入力してください。）
```linux:terminal
$ sudo apt update
```

**sudo**
…LinuxやUnix系のOSで使用されるコマンドです。特定のコマンドを管理者権限（root権限）で実行するために使われます。

**apt**
…Debian系のLinuxで使用されるパッケージ管理ツールです。
　パッケージのインストール、アップデート、削除等を行うために使用されます。

②次に、MySQLのインストールを行います。
```linux:terminal
$ sudo apt install -y mysql-server
```

**-y**
…例えばインストール等を行う際に、インストールを実行するかしないかの確認を求められることがあります。
　（実行するのであれば「y」(yes)、実行しないのであれば「n」(no)を入力し、Enterを押して回答しなければならないフェーズが発生します。）その都度確認を求められたくない場合、自動的に「yes」を回答するためのオプションです。


③インストールが完了したら、下記のコマンドでインストールされたMySQLのバージョン確認を行います。

```linux:terminal
$ mysql --version

=>mysql  Ver 8.0.40-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
```

ここでは2024年11月29日時点の最新バージョンが表示されていますが、インストール時期によってバージョンの数値が異なる場合があります。
MySQLのバージョンが確認出来たら、インストール完了です。


### MySQL設定方法

まず各種サービスが起動しているかの確認方法について説明します。

下記コマンドで現在どのサービスが動作しているかの確認が行えます。
MySQLサーバが起動しているかどうかもこちらで確認できます。
```linux:terminal
$ sudo service --status-all
```

MySQLサーバをまだ起動していないため、最初はこのように表示されます。
```linux:terminal
 [ ? ]  binfmt-support
 [ - ]  dbus
 [ ? ]  hwclock.sh
 [ - ]  procps
 [ - ]  rsync
 [ + ]  ssh
 [ - ]  x11-common
```

ステータスの見方は下記のようになります。
\[ ? ]: サービスのステータスが不明であることを示します。
\[ - ]: サービスが停止していることを示します。
\[ + ]: サービスが実行中であることを示します。

では実際にMySQLサーバを起動させるための準備を行います。


まずMySQLユーザーのホームディレクトリを作成します。（画面からディレクトリを作成しても良いです。）
```
sudo mkdir /workspaces/test/mysql_practice
```

**mkdir**
…ディレクトリを作成します。

MySQLユーザーのホームディレクトリを設定:
```
sudo usermod -d /workspaces/test/mysql_practice mysql
```

**usermod**
…ユーザーアカウントのプロパティを変更するためのコマンドです。

**-d**
…ユーザーのホームディレクトリを指定するためのオプションです。

ここでようやくMySQLサービスの起動を行うことができます。
```
$ sudo service mysql restart
```

MySQLが起動されたかどうか、先ほどのサービスの状態を確認するコマンドで見てみましょう。
```
$ sudo service --status-all

->
 [ ? ]  binfmt-support
 [ - ]  dbus
 [ ? ]  hwclock.sh
 [ + ]  mysql
 [ - ]  procps
 [ - ]  rsync
 [ + ]  ssh
 [ - ]  x11-common
```

mysqlの部分が増え、[+]が表示されているので無事MySQLが起動していることが確認できました！

ということでMySQLサーバに接続してみましょう。

```
$ sudo mysql -u root
```

**-u root**
…rootユーザーとしてMySQLサーバに接続します。「-u」はユーザーを指定する際のオプションです。

このように表示され、コマンド入力箇所が「mysql> 」となっていれば無事MySQLに接続できたということになります。
```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.40-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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で使用される文字セットの確認を行います。
（「mysql>」はすでに表示されているはずですので、それ以降を入力してください。）

```sql:terminal
mysql> show variables like '%char%';

->
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

日本語が使用できるようにutf-8が基本的に設定されていることが確認できます。
character_set_filesystem部分のbinaryはファイルシステムで使用される文字セットがバイナリであることを表しています。例えば、ファイル名やファイルパスの文字が変換されずにそのまま扱われるということです。

ちなみにMySQLサーバから抜け出すには下記のコマンドを入力してください。
（コマンド入力箇所の表示が「$」に戻るはずです。）
```
mysql> exit
```

## DB操作（一覧表示・追加・削除・切替）

### DBの一覧表示
下記のコマンドで今存在するデータベースを一覧で確認することができます。
```sql:terminal
mysql> show databases;

->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```

現在MySQLでデフォルトで作成されているデータベース群が表示されます。



ちなみに任意のデータベースのみ表示したい場合は下記のように条件を指定して一覧表示することもできます。例えば下記のように記述すると、その文字列を含むデータベースのみが表示されます。
この文字列の条件指定の方法は後程解説します。

```sql:terminal
show databases like '%schema%';

->
+---------------------+
| Database (%schema%) |
+---------------------+
| information_schema  |
| performance_schema  |
+---------------------+
2 rows in set (0.00 sec)
```

### DBの作成

DBの作成方法はいたって簡単です。

```sql:terminal
mysql> create database testdb01;
```

意味としては、「testdb1というDBを作成する」です。そのままの意味ですね。
コマンドを入力し、このように表示されていると問題なくコマンドが実行できたということになります。

```
Query OK, 1 row affected (0.00 sec)
```

念のため先ほど作成したDBが存在しているか確認してみましょう。

```sql:terminal
mysql> show databases;

->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb01           |
+--------------------+
5 rows in set (0.01 sec)
```

先ほど作成したDBが存在することを確認できました。

### DBの削除
DBの削除方法もいたって簡単です。
下記のコマンドを使用して先ほど作成したDBを早速削除してみます。

```sql:terminal
mysql> drop database testdb01;
```

意味としては、「testdb1というDBを削除する」です。こちらもそのままの意味です。

ここで先ほどのDBが削除できたかどうか確認してみましょう。

```sql:terminal
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```

きれいさっぱりtestdb01が無くなりました。
ちなみにですが、実際の業務でDBの削除を行うのはかなり稀です。
間違ってもデータのバックアップを行っていない状態でDBの削除を行わないよう注意が必要な作業となります。

### DBの切替
次にDBの切り替えを行います。
先ほど一覧にも表示していたように、複数のDBを管理することができ、操作対象とするDBに切り替えることができます。
これらを切り替えるコマンドをご紹介します。

まず２つDBを作成します。

```sql:terminal
mysql> create database testdb01;
mysql> create database testdb02;
```

そして、現在操作対象となっているDBの確認を行います。

```sql:terminal
mysql> select database();

->
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)
```

NULLという風に表示されました。これは空・何もないことを意味する単語です。
つまり、現在操作対象となっているDBはないということです。

では、先ほど作成したDBのうちの「testdb01」を下記コマンドで操作対象に設定してみましょう。

```sql
mysql> use testdb01;

->Database changed
```

再び操作対象のDBを確認してみます。
```sql:terminal
mysql> select database();

->
+------------+
| database() |
+------------+
| testdb01   |
+------------+
```

このようにtestdb01が操作対象となるDBとして表示されるようになりました。

ただ、rootでMySQLサーバに接続してこのようにいちいち使用したいDBを操作対象にするのは面倒くさいですよね。
実は、接続時点でに使用したいDBを設定することもできます。

一旦MySQLサーバからログアウトします。
```sql:terminal
mysql> exit;
```


ログイン時に下記のように最後にDBを指定して実行すると、DBが指定された状態になります。
今度はtestdb02を指定してみましょう。

```linux:terminal
$ sudo mysql -u root testdb02;
```

念のため確認してみます。
```sql:terminal
mysql> select database();
+------------+
| database() |
+------------+
| testdb02   |
+------------+
1 row in set (0.00 sec)
```

このようにDBが指定されていることが確認できました。ログイン時の効率化ができます。

## ユーザー作成
今までroot権限のユーザーを使用してきましたが、いわゆる管理者権限でDB作成・削除なんでもできてしまうので、それぞれのDBを使用できるユーザーを作成したいと思います。

そのためにまず、なんでもできるroot権限のユーザーで一旦ログインした状態にしておきます。

次に下記コマンドを実行して、localhostからアクセスできるtester01というユーザーを作成します。

```sql:terminal
mysql> create user tester01@localhost identified by '12345';
```

**tester01@localhost**
…作成するユーザーの名前とホストを指定します。ここでは、ユーザー名がtester01、
　ホストがlocalhost（ローカルマシン）です。

**identified by '12345'**
…ユーザーのパスワードを指定しています。ここでは例として簡単なパスワードにしていますが、通常思いつきにくいパスワードを設定するのがセオリーです。

次にtester01というユーザーに対して、DB「testdb01」の全使用権限を与えるコマンドを実行します。

```sql:terminal
mysql> grant all on testdb01.* to tester01@localhost;
```

一旦root権限ユーザーをログアウトします

```sql:terminal
mysql> exit;
```

先ほど作成して権限を与えたtester01のユーザーでログインしてみます。

```linux:terminal
$ sudo mysql -u tester01 -p
```

「Enter password:」という表示が出てくるのでパスワードを入力してEnterを押下してください。
（セキュリティ上、入力したパスワードは表示されないようになっています。バグとかではないのでそのまま入力してOKです。）

**-p**
…パスワードを入力したいときのオプションです。

このように表示が出たら、ログイン成功です。
```sql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.40-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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> 
```

では本当にtester01が使用できる状態なのかどうか確認します。

```sql:terminal
mysql> show databases;
->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| testdb01           |
+--------------------+
3 rows in set (0.00 sec)
```

このtester01のユーザーは「testdb01」のDBのみデータの確認や追加・削除などの操作ができます。


## SQLファイル

次に「SQLファイル」というSQL文等を記載したファイルを作成します。
このファイルを実行することでDB・テーブル・レコードの追加・削除・更新等様々な処理を一気に行うことができ、効率化につながります。ルーティン化できる手順があればSQLファイルにひとまとめで記載しておくと便利です。

試しに、DBの初期化ファイルを作成してみましょう。

```sql:test_file.sql
drop database if exists testdb;
create database testdb;
drop user if exists tester03@localhost;
create user tester03@localhost identified by '12345';
grant all on testdb.* to tester03@localhost;
```

**drop database if exists testdb;**
…「testdb」というDBが存在した場合、削除する。

**create database testdb;**
…「testdb」というDBを作成する。

**drop user if exists tester01@localhost;**
…localhostに「tester03」というDBが存在した場合、削除する。

**create user tester03@localhost identified by '12345';**
…localhostに「tester03」を、パスワードを「12345」に設定して作成する。

**grant all on testdb.\* to tester03@localhost;**
…「testdb」DBのすべての権限を「tester01」に与える。

下記コマンドをターミナルで実行します。
```linux:terminal
sudo mysql -u root < test_file.sql
```

これで先ほどのコマンドがすべて実行されました。
tester03でログインし、「testdb」のDBが確認出来たら成功です。
```sql:terminal
mysql> show databases;
sudo mysql -u tester03 -p
```

```sql:terminal
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| testdb             |
+--------------------+
3 rows in set (0.00 sec)
```

## SQLファイルのコメントアウト方法
下記のようにコメントアウトすることで、一部の処理を行わないようにできます。
```sql:comment.sql
-- 1行コメントです。

/* 複数行
   コメント
   です */
```