MySQLをインストール(Mac編)

#記事を作成した背景
プログラミングを独学されている方や、コーチングの際、簡単なWebアプリケーションを作ってみたい！
という時に、やはりDBを使えた方ができる範囲は広くなります。
その際、必要最低限のことだけをまとめた記事が無かったので、
簡単なWebアプリケーション作成に際し、必要最低限の内容をまとめてみました。

#概要
MacにMySQLをインストール手順を紹介します。
いろんな言語・フレームワークでWebアプリケーションを作成する際、
データベース(以下、「DB」)を使用する場面が多いと思います。
本記事では完全初心者の型がWebアプリケーションを作成する際に最低限必要なMySQLのインストール方法を記事にしました。
ターミナルの起動の仕方からお伝えするので、完全初心者の方もご安心下さい。

#1. ターミナル起動編

まずはMySQLのインストールのためにターミナルを起動します。
ターミナルの起動方法は「Command + Space」を押し、Spotlight検索を呼び出します。

![スクリーンショット 2021-04-27 12.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/cffb7908-f7d4-85b4-048a-f322ca1d3843.png)

そこで「ターミナル」と入力し、

![スクリーンショット 2021-04-27 12.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/ab3ff272-a67f-57f2-2f9b-418e0e852d87.png)

「Enter」キーでターミナルが起動します。

![スクリーンショット 2021-04-27 12.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/8432ba36-0336-2df4-e600-f8310bb43a2b.png)

いかにもエンジニア！っぽい画面が立ち上がってテンション上がってきましたね！
また、Spotlight検索はアプリケーション立ち上げのショートカットとして便利なのでぜひ活用して下さい！

それでは続いてここにコマンドを入力して、更にエンジニアっぽいことをしていきましょう！

#1. MySQLインストール編
先程立ち上げたターミナルにコマンドを入力し、MySQLをインストールします。

```
# MySQLインストールコマンド
brew install mysql
```

#2. MySQL起動編

インストール完了まで少し時間がかかりますが、無事完了したらインストールしたMySQLを起動します。
このコマンドは、PC立ち上げ時等、MySQLにアクセスする際は毎回実行する必要があるのでぜひ覚えておいて下さい。

```
# MySQL起動コマンド
mysql.server start
```

以下のように表示されたら起動成功です！

![スクリーンショット 2021-04-27 12.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/252e873d-3508-84c3-a413-1f83666ab6a5.png)

ちなみに、MySQL停止コマンドは以下になります。

```
# MySQL停止コマンド
mysql.server stop
```

#3. MySQLログイン編

MySQLの起動が完了したら、MySQLにログインしてSQLを実行できる状態にします。

```
# MySQLログインコマンド
mysql -u root
```

無事ログインできたら、ターミナルの行頭に以下のように「mysql」という文字が表示されていると思います。

![スクリーンショット 2021-04-27 12.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/b09a0753-fd72-2cfc-d3cc-92d3b4156b47.png)


合わせて簡単にコマンドの説明もしておきます。
「mysql」コマンドに続く「-u」はユーザ名を指定してMySQLへログインするオプションになります。
続く「root」はMySQLインストール時に最初から用意されているユーザです。
ただ、「root」ユーザはとても強力な権限を持っているので、
普段からこのrootユーザでログインして作業をするのは、
大事な設定を間違えて上書きしてしまったり等ヒューマンエラーが発生する可能性が出てきてしまいます。

そこで、通常は、作業用に最低限の権限を付与したユーザを作成し、そちらでログインをして作業する形になります。
MySQLをインストールした直後は「root」ユーザしか用意されていないため、
ここから必要なDBを作成し、そのDBを操作する権限のみを付与したユーザを作成します。

#4. 簡単な用語紹介
ここから新しくDB、テーブル等を作成していく上で、必要最低限の5つの用語を簡単にご紹介しておきます。
これ以降、下記5つの単語が記事内に出てくるので、わからなくなったら適宜ご参照下さい。
※触りの説明だけなので、詳しく知りたい方はGoogle先生へ！

●データベース
テーブルの集合体を表します。
Excelで例えると、これがExcelファイル自体になります。

●テーブル
レコードの集合体を表します。
実際にデータを格納するもので、
Excelで例えると「シート」になります。
「シート」の中に実際の値を格納していきますよおね。

●レコード
テーブルの中身を表す言葉で、イメージとしては「行」になります。

●カラム
テーブルの中身を表す言葉で、イメージとしては「列」になります。

●フィールド
テーブルの中身を表す言葉で、レコード(行)とカラム(列)が重なった場所になります。
Excelで例えると「セル」ということになります。

#5. DB作成
それではMySQLのインストール、起動、5つの用語を覚えたところで、実際にDBを作成していきます。
まずは作業するためのExcelファイルを作成する、というイメージですね！
下記コマンドで「testdb」という名前のDBを作成します。

```sql
-- 構文: CREATE DATABASE `{DB名}` DEFAULT CHARACTER SET {文字コード};
CREATE DATABASE `testdb` DEFAULT CHARACTER SET UTF8;
```

#6. ユーザ作成
DBの作成が完了したので、ここでrootユーザの出番は終了します。
ここからは新しく「testdｂ」を操作する権限だけを持ったユーザに切り替えていきます。

ユーザ作成は下記コマンドになります。

```sql
-- 構文: CREATE USER '{ユーザ名}' IDENTIFIED BY '{パスワード}';
CREATE USER 'user01'@'localhost' IDENTIFIED BY 'testpassword';
```

ユーザ名部分が少しわかりにくいかもしれませんが、
「user01」がログイン時に使用するユーザ名で、「testpassword」部分がパスワードになります。

それでは先程作成したユーザに「testdb」を操作する権限を与えていきます。

```sql
-- 構文: GRANT {付与権限名} ON `{対象DB名}`.* TO '{権限付与ユーザ名}';
GRANT ALL ON `testdb`.* TO 'user01'@'localhost';
```

付与権限名に「ALL」を指定しているので、
今回は「testdb」に対する全ての権限を「user01」に与える形になります。

それでは無事ユーザの作成と権限付与が完了したので、
現在ログイン中のrootユーザからログアウトし、新しく作成したuser01でログインを行います。

ログアウトコマンドはこちらになります。

```sql
exit
```

ログアウトが完了したら、user01でログインします。

```
mysql -u user01 -p
```

上記コマンドを入力するとパスワードを聞かれるので、先程ユーザ作成時に指定したパスワードを入力します。

```
testpassword
```

これで無事user01にログインができました。一安心ですね。

#7. テーブル作成
それではDB及びユーザの作成・切り替えが完了したので、テーブルを作っていきます。
※イメージとしては、Excelファイル自体の作成はできたので、今からその中にシートを作っていく、という流れになります。

まずは今から操作するDBを指定してあげる必要があります。

```sql
use `testdb`
```

これで以降実行するクエリは`testdb`を対象としたものになります。
他のDBを操作したい場合は、再度「use」文を使用すれば切り替えられます。

では、テーブルを作成していきます。
※先程までと違い長い構文なので、
一度テキストエディタに記述し、それをターミナルにコピペする方法がやりやすいと思います。

```sql
CREATE TABLE `books`(
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `title` VARCHAR(255) NOT NULL,
    `author` VARCHAR(64) NOT NULL,
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```

長い構文ですが、1つずつ簡単に説明していきます。
まず今回作成するテーブル名は「books」になります。
本の情報を格納するテーブルを想定して作成しました。

続いて「id」〜「updated_at」行まで、これらがカラム(列)になります。
なのでExcelで例えると、1行目に見出しを作成するイメージになります。
見出しは作成できましたが、その中に実際に入れるデータはどんな形式なのかをあらかじめ指定してあげる必要があります。
それがINTやVARCHARとなります。
こちらはプログラミング言語の変数と同じイメージで大丈夫です。
型の種類や詳細が知りたい方は[公式ドキュメント](https://dev.mysql.com/doc/translation-refman/8.0/ja/data-types.html)をご参照下さい。

それでは今回指定したカラムについて1行ずつ見ていきます。

●idカラム

```sql
`id` INT PRIMARY KEY AUTO_INCREMENT
```

主キー(PRIMARY KEY)になります。
MySQLのテーブルは、レコードごとに必ず一意(ユニーク)になる値を格納してあげる必要があります。
Excelでいうと画面左側に連番で続いてる数字ですね！
なのでINTの型の指定のあと、「PRIMARY KEY」を記述しています。
さらに続けて「AUTO_INCREMENT」と記述しているのは、
このテーブルにデータを格納した際、自動的に連番で一意(ユニーク)な数字を採番してくれる設定になります。
Excelのシート画面では、予め画面左側に数字が連番で採番されていますが、
「AUTO_INCREMENT」の場合、1行新しく書き足していく度に勝手に数字が採番されていく、というイメージになります。

●titleカラム

```sql
`title` VARCHAR(255) NOT NULL
```

本のタイトルを保存するために用意しました。
当然数字ではなく文字列になるので、「VARCHAR」を指定しています。
その後ろの(255)というのは、格納する文字列のサイズを予め指定しています。

●authorカラム

```sql
`author` VARCHAR(64) NOT NULL,
```

本の著者を保存するために用意しました。
titleに比べそこまで長い名前の方はいないであろう、ということでサイズは(64)を指定します。

●created_atカラム

```sql
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
```

MySQLのテーブルにもたせておく慣例のカラムです。
そのレコードの作成日時を格納します。
「DEFAULT CURRENT_TIMESTAMP」というのは、レコード作成時に自動的に現在日時が保存される設定になります。
これでプログラム側でいちいち現在日時を取得して挿入しなくても良いので、とても便利ですね！

●updated_atカラム

```sql
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
```

created_at同様、MySQLのテーブルにもたせておく慣例のカラムです。
そのレコードの最終更新日時を格納します。
「DEFAULT CURRENT_TIMESTAMP」まではcreated_atカラムと同様ですが、
続いて「ON UPDATE CURRENT_TIMESTAMP」という文が続いています。
これはレコード更新時に自動的に現在日時が上書きされる設定になります。
こちらもプログラム側でいちいち制御しなくて良いので、とても便利ですね！

今回は5個のカラムを持つテーブルを作成しましたが、
これが10個になろうが2個だろうが構文に変わりは無いのでご安心下さい。

以上でテーブルの作成は完了しました！

#まとめ
これで一旦、DBを作成し、中にテーブルを作成するところまで学びました。
おめでとうございます！

この後は、プログラム側でORMを使用して実際にテーブルにデータを出し入れする流れになります。

本記事は学習用の簡易Webアプリケーションを作成する際のDB接続の最初の一歩のための記事になります。
本当はもっと細かいお話が色々ありますが、学習時に大事なモチベーションを保ったままでいただきたいので、
極力ややこしい話は割愛しておりますのでご了承下さい。