MySQLの操作

### はじめに
MySQLの学習中で起動からテーブル作成やカラムの追加などのメモ

#### 起動・ログイン
- MySQLの起動

```bash
mysql.server start
```

- MySQLの停止

```bash
mysql.server stop
```

- ログイン

```bash
# rootユーザーでログイン
mysql -u root

# 作成したユーザーuser_nameでログインします -pでパスワードを要求する
# オプションの説明
# -u で接続するユーザー名を指定する
# -p でパスワード入力を促す
mysql -u user_name -p
```

- ログアウト

```bash
exit
```

- ログイン中のユーザーを表示

```bash
SELECT user();
```

---

#### ユーザーの作成・削除・権限付与
- ユーザーの作成

```bash
# 名前とホストの指定　下記の場合はuser_nameというユーザーとホスト先をlocalhostとしている
CREATE USER 'user_name'@'localhost';

# パスワード設定・変更
ALTER USER 'user_name'@'localhost' IDENTIFIED BY 'user_password';

# ユーザ作成&パスワード設定
CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'your_password';

# ユーザー名、host名、パスワードを設定する際はシングルクォート''を忘れないように！
```

- ユーザーの確認

```bash
SELECT  host, user FROM mysql.user;
```

- ユーザーの削除

```bash
# user_nameという名前のユーザーを削除　host先の指定も忘れずに！
DROP USER 'user_name'@'localhost';
```

- ユーザーの権限確認

```bash
SHOW GRANTS FOR 'user_name'@'localhost';
```

- ユーザーの権限の付与

```bash
# 権限：(SELECT,INSERT,UPDATE,ALL,PRIVILEGESなど)
# データベース.テーブル：(testdb.*やtestdb.testtableなど)
# *.*とすることで全てのデータベースとテーブルに権限を与えることができる
GRANT 権限 ON データベース.テーブル TO 'user_name'@'localhost';

# 権限をデータベースとテーブルに対してuser_nameにフルアクセス権を付与した場合
GRANT ALL PRIVILEGES ON *.* 'user_name'@'localhost';
```

- 権限のリロード

```bash
FLUSH PRIVILEGES;
```

---

#### データベースの作成・削除
- データベースの作成

```bash
# test_dbというデータベースの作成
CREATE DATABASE test_db;
```

- 作成したデータベース一覧を表示

```bash
SHOW DATABASES;
```

- 作成したデータベースを削除

```bash
DROP DATABASE test_db;
```

- データベースの指定

```bash
# test_dbというデータベースを指定
USE test_db;
```

- 接続しているデータベースの確認

```bash
SELECT DATABASE();

# 接続していない場合はNULLが返ってくる
```

---

#### テーブルの作成・削除
- テーブル一覧を表示

```bash
SHOW tables;
```

- テーブルとカラムの作成

```bash
# "INT"型のカラム"id"と"VARCHAR(255)"型のカラム"name"と"TEXT"型のカラムintroductionのある"test_samples"テーブルを作成
# INT型:数字が保持できる VARCHR(M):最大M文字の文字列が保持できる
CREATE TABLE test_samples (id INT, name VARCHAR(255), introduction TEXT);

# ちなみにテーブルのみ作成はできなく、少なくとも1つのカラムを指定し
# そのカラムのデータ型を定義する必要がある
```

- テーブルの削除

```bash
# test_samplesを削除
DROP TABLE test_samples;

# 複数のテーブルを一度に削除する場合はカンマで区切る
DROP TABLE table1, table2, table3;
```

- テーブルの構造を確認

```bash
# test_samplesテーブルを使用している
# カラム一覧を表示
DESC test_samples;
# FROM句で対象となるテーブルを指定する際に使用する
SHOW columns FROM test_samples;
```

---

カラムの追加・変更

- カラムの追加

```bash
# ALTER文はデータベースやテーブルを編集できるSQL文(カラムの追加や削除ができる)
# created_atカラムを追加
ALTER TABLE test_samples ADD (created_ad DATETIME);
```

- カラムの変更

```bash
# introductionカラムをdetailカラムに変更
ALTER TABLE test_samples CHANGE introduction detail TEXT;
```

- カラムのデータ型の変更

```bash
# detailカラムのデータ型をTEXTからvarcarに変更
ALTER TABLE test_samples MODIFY detail VARCAR(255);
```

- MODIFYとCHANGEの違い

| 操作 | MODIFY | CHANGE |
| --- | --- | --- |
| カラム名の変更 | ❌できない | ✔️できる |
| データ型や制約の変更 | ✔️できる | ✔️できる |
| 使用方法 | MODIFY　カラム名　データ型 | CHANGE　現在のカラム名　新しいカラム名　データ型 |

- カラムの削除

```bash
# deteilカラムを削除
ALTER TABLE test_samples DROP deteil;
```

#### データの挿入・削除

- データの挿入

```bash
INSERT INTO test_samples (name, introduction)
VALUES ('佐藤', '面白い'), ('山田', 'イケメン'),('白石', 'かわいい');
```

- データの削除

```bash
# 佐藤のレコードを削除
DELETE FROM test_samples WHERE name = '佐藤';
```


---

#### インポート・エクスポート

- インポート

```bash
# インポートしたい.sqlファイルが保存されているディレクトリに移動
cd /path/sample/test/

# mysqlにログインしている場合は下記のコマンドは使えないため注意
# mysqlコマンドを使用してsqlファイルの内容をデータベースに反映
mysql -u root -p test_db < test.sql

# mysqlにログインしている際にインポートする方法
# パスを指定してSOURCEコマンドでsqlファイルをインポート
SOURCE /path/sample/test/test.sql;
```
- エクスポート

```bash
# ターミナルで作成したテーブルをtest_dbのデータベースにtest.sqlファイルにエクスポート
# mysqlにログインしている場合はmysqldumpコマンドは使えないため注意！

# mysqldumpコマンド
mysqldump -u root -p test_db > test.sql

# mysqldumpを使うメリット
# ・バックアップ、移行、複製に使える
```

---

### まとめ

以上、MySQLを操作する際の一連の流れでした！
その他、追加することなどあれば随時更新していきたいと思います。