【MySQL学習】よく使う管理系コマンド

# はじめに
MySQLでよく使う管理系コマンドについて学習したことを簡単にまとめます。

# 検証に使用した環境
DB：MySQL8.0

# 諸注意
## MySQLにはスキーマはない
MySQLには、他のデータベースのようにスキーマはなく、データベースがスキーマと同じ位置付けになります。

# データベースの操作
## データベースに接続する
```shell
shell> mysql -h ホスト -u ユーザ名 -p
Enter password: 
```

※MySQLが稼働しているホスト上で実行する場合、ホストは省略できます

## データベースとの接続を切断する
exit、quitで接続を切ることができます。
UNIX系であれば「ctrl + D」でも可能です。

```shell
mysql> exit
Bye
```

## コマンドラインから直接SQLを実行する場合
```shell
mysql> mysql -u ユーザ名 -pパスワード DB名 -e'show databases;'
```

※-pにスペース無くパスワードを付与するとコマンド内にパスワードを入れ込めます。（警告あり）

例）
```shell
sh-4.2# mysql -umysql -pPassword@1 mysql -e'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

## データベースを作成する
データベース名は64文字まで
日本語も使用出来ますが、半角の英数字の大・小文字と「_」を使用する方が良い

```shell
mysql> create database オプション データベース名 データベースの仕様オプション;
```

## データベースの定義を変更する

```shell
mysql> alter database データベース名 データベースの仕様オプション;
```

### 仕様オプションの例
#### 文字セット・文字照合

```shell
character set=utf8
```

[詳しくはこちら](https://dev.mysql.com/doc/refman/8.0/ja/charset-charsets.html)

## データベースを削除する
```shell
mysql> drop database オプション データベース名;
```

### オプション例
#### IF EXISTS
データベースが存在しなくてもエラーにならなくなります。

## データベースを一覧する
```shell
mysql> show databases;
```

## 操作するデータベースを指定する
```shell
mysql> use データベース名;
```

## 現在使用しているデータベースを表示する
```shell
mysql> SELECT database();
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)
```

# テーブルの操作
## テーブルを作成する
```shell
mysql> create table オプション テーブル名 (列定義, ...) テーブルオプション;
```

### 列定義
```shell
列名 データ型 列オプション
```

[詳しくはこちら](https://dev.mysql.com/doc/refman/8.0/ja/create-table.html)

#### 列オプション例
##### default
データを登録した時、対象の列の値が未指定の場合のデフォルト値を指定します。

##### auto_increment
自動でカウントアップを指定します。

##### unique
列内で重複する値を許容しなくなります。
※主キーとは別

##### primary key
対象列を主キーとて扱います。

##### not null
nullを許容しなくなります。

### オプション例
#### IF NOT EXISTS
テーブルが存在してもエラーにならなくなります。

### テーブルオプション
ストレージエンジンや行フォーマット、暗号の有無を指定出来ます。

## テーブル定義を変更する
```shell
mysql> alter table テーブル名 操作 操作内容;
```

#### 列を追加する
```shell
mysql> alter table テーブル名 add 追加列名 列定義;
mysql> # 例
mysql> alter table hogetable add col_hoge varchar(10);
```

#### 既存列の型を変更する
```shell
mysql> alter table テーブル名 change 列名 列定義;
mysql> # 例
mysql> alter table hogetable change col_hoge col_hoge int;
```

#### 既存列に列オプションを追加する
```shell
mysql> alter table テーブル名 alter 列名 set 列オプション;
mysql> # 例
mysql> alter table hogetable alter col_hoge set default '';
```

#### 既存列の列名を変更する
注意として、列定義であるデータ型とオプションを全て指定する必要があります。

```shell
mysql> alter table テーブル名 change 現列名 新列名 列定義;
mysql> # 例
mysql> alter table hogetable change col_hoge_old col_hoge_new varchar(10) default '';
```

#### 列を削除する
```shell
mysql> alter table テーブル名 drop 列名;
```

#### テーブル名を変更する
```shell
mysql> alter table 旧テーブル名 rename to 新テーブル名;
```

## テーブルを削除する
```shell
mysql> drop table オプション テーブル名;
```

### オプション
#### IF EXISTS
テーブルが存在しなくてもエラーにならなくなります。

## truncate

```shell
truncate tbl_name;
```

## テーブルを一覧する
```shell
mysql> show tables;
```

## テーブルの列定義を確認する
```shell
mysql> describe テーブル名;
```

# 参考文献
https://www.amazon.co.jp/gp/product/B07YNB6QLJ/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1

https://dev.mysql.com/doc/refman/8.0/ja/connecting-disconnecting.html

https://dev.mysql.com/doc/refman/8.0/ja/alter-database.html

https://dev.mysql.com/doc/refman/8.0/ja/charset-charsets.html

https://dev.mysql.com/doc/refman/8.0/ja/alter-table.html

https://dev.mysql.com/doc/refman/8.0/ja/create-database.html

https://dev.mysql.com/doc/refman/8.0/ja/create-table.html

https://dev.mysql.com/doc/refman/8.0/ja/drop-database.html

https://dev.mysql.com/doc/refman/8.0/ja/drop-table.html

https://dev.mysql.com/doc/refman/8.0/ja/rename-table.html