MySQLチートシート

# 実行環境
- macOS(bash)
- MAMP
- VS Codeでターミナル操作

# MYSQLへログインする方法
MAMPを使っている場合は、きちんとMAMPでローカルサーバやデータベースを動かしている状態で、作業ディレクトリへ移動

```terminal
$ cd /Applications/MAMP/Library/bin/
```

mysqlコマンドでログインする

```terminal
$ ./mysql -u root -proot
```

MAMPのMySQLはデフォのパスワードがrootなので上記でログインできる。   
パスワードまで一気に入れないコマンドは以下。入力するとパスワードを聞いてくれる。

```terminal
$ ./mysql -u root -p
```

`mysql>`が表示されたら、ログイン成功。
`QUIT`と入力して抜ける

## 使用するデータベースを選択してログインする方法
先ほどまで紹介した方法だと、ログインしかできないので、ログイン後に使用するデータベースをUSEコマンドで指定しないといけない。
一気にログインと使用データベースを選択する方法は以下の通り。

```
./mysql -D データベース名 -u ユーザ名 -pパスワード
```

# 閲覧する
## 今あるデータベース一覧を見る

ログインしていて、`mysql>`が表示された状態で`SHOW DATABASES;`
※ セミコロン`；`まで入れないと、Enterキーを押したとき実行されず、改行されて`->`が出力されるので、きちんとセミコロンまでつけること！

```terminal
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| info_schema        |
| pre_schema         |
| wordpress          |
+--------------------+
3 rows in set (0.00 sec)
```

次に使いたいデータベースを`USE`コマンドで選択して中身を見ることができる。

```terminal
mysql>USE データベース名
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
```



## テーブル一覧を見る
mysqlへログイン後、USEコマンドで使用するデータベースを選択してから、以下のコマンドを打ち込む。
使用するデータベースを選択していない状態だと以下のコマンドが通らないので注意。

```terminal
mysql>SHOW TABLES;
```

### USEコマンドを使わないで一気にデータベース名を指定して、テーブル一覧を見る
USEコマンドをまだ打っていない(使用しているデータベースを未選択状態)の場合は、以下のコマンドを使うとUSEコマンドを打ちながら一気にテーブル一覧を見ることができる。

```
SHOW TABLES FROM テーブル名;
```

## カラム一覧を見る

```
SHOW COLUMNS FROM カラム名;
```

## レコード一覧を見る

テーブルに登録されているレコード(データ)の全件を出力させて閲覧するには以下の方法で実施できる。

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


# 作成する
## 新しいデータベースを作成する
MySQLにログインした状態で、CREATE文でデータベースを作成

```terminal
mysql>CREATE DATABASE データベース名;
```

使うデータベースを選択

```terminal
mysql>USE データベース名;
```

## 新しいユーザを追加する

MySQLにログインした状態で、以下のGRANTコマンド入力

```terminal
mysql>GRANT ALL ON データベース名.* TO user@localhost IDENTIFIED BY 'pass';
```

GRANT文で、`CREATE USER 'ユーザ名'@'接続元ホスト名' IDENTIFIED BY 'パスワード';`を入れてユーザを作る。

- `ALL`はユーザーに権限を付与する、
- `ON データベース名`でどのデータベースに権限付与をするかを示す
- `TO user@localhost`で、localhostという接続ホストでuserさんに権限を付与
- `IDENTIFIED BY 'pass'`でパスワードをpassに設定

上記コマンドだけでは権限が反映されないので、反映させるコマンド

```terminal
mysql>FLUSH PRIVILEGES;
```



### ユーザ一覧取得

```
mysql>SELECT User, Host FROM mysql.user;
```

### ユーザ削除

```
mysql>DROP USER ユーザ@接続元ホスト;
```

## 新しいテーブルを作成する
MySQLにログインした状態で、以下のGRANTコマンド入力

```terminal
mysql>CREATE TABLE テーブル名(
  id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  body TEXT NOT NULL,
  category_id INT DEFAULT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL
) DEFAULT CHARACTER SET=utf8mb4;
```

CREATE TABLE + テーブル名を入力して、

()の中に,`カラム名 カラムの型 オプション`の形で書いていく。

例えば1行目`id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,`だと

- `id` はカラム名
- `INT`はデータ型が整数型という意味
- `PRIMARY KEY`は主キーを示すオプション。これが一番上ってこと。
- `NOT NULL` でこのカラムが空はダメということ。
- `AUTO_INCREMENT`は、レコードを挿入するときに、自動的に番号を付与してくれる

閉じカッコのあとの`DEFAULT CHARACTER SET`は、このテーブルで使う標準の文字セットの設定。utf8mb4は、スマホから入力する絵文字などにも対応した文字セット。

titleカラムの`VARCHAR(255)`は文字数が255文字まで、という指定

bodyカラムの`TEXT`は長くなりそうな文章に使う。

created_atはレコードの作成日、updated_atはレコードの編集日で、`DATETIME`という日付指定型のデータ型を割り当てる。


できたら、きちんとできているかデータ構造を表示させる

```
mysql>DESC テーブル名;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| title       | varchar(255) | NO   |     | NULL    |                |
| body        | text         | NO   |     | NULL    |                |
| category_id | int(11)      | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |
| updated_at  | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
```

# レコードの追加、変更
## 新しいレコードを挿入する
`USE データベース名`などで使用データベースを指定した状態で、以下のINSERTコマンドで挿入できる。

```
INSERT INTO テーブル名 VALUES(null, "名前", "パスワードの文字列");
```

一番最初はidだったとしたら、idはNOT NULLにして置くものなので、ここではあえてnullにすると、自動で割り振られる。
このように、使うテーブル名を指定し、挿入したい値をカンマ区切りで入れていくだけ。


## 特定のidのレコードの、カラムの値を変更する
レコードの特定の行の特定の値を変更したいときは以下のコマンドで実施する。
変更したい値が整数値の時は`''`が不要だが、アルファベットや日本語の場合は`''`で値を囲むこと。

```
UPDATE テーブル名 SET カラム名 = '変更後の値' WHERE id = 変更したいレコードのid;
```

例
```
UPDATE users SET name = '肉食う人' WHERE id = 33;
```


### 特定のidのレコードの、複数のカラムの値を変更する

変更するカラム名と値のセットをカンマ(,)区切りにするだけ。

```
UPDATE テーブル名 SET カラム名 = 変更後の値 , カラム名2 = 変更後の値2 WHERE id = 変更したいレコードのid;
```

例
```
UPDATE users SET name = '肉食う人', age = 33 WHERE id = 33;
```