基本的なmysqlの操作

久しぶりにmysqlを触ったので、メモとして残しておきます。
あくまで基本的なところですが。

# mysqlの接続、終了、再起動
## mysqlに接続
```
mysql -u root -p
```
`-u`　ユーザーの指定
`root`　rootユーザーを指定
`-p`　パスワードを指定してログイン

## mysqlの終了
```
quit
```

## mysqlの再起動

```
service mysqld restart
```

# 操作の前に
mysqlでのコマンドは基本的に末尾に`;`を入れるのを忘れないようにしてください。
rubyとかに慣れてしまうとついつい忘れてしまうんですよね・・・

# データベースの操作
## データベースの作成
```
CREATE DATABASE データベース名;
```
例えば、「db_training」というデータベースを作成する場合
`CREATE DATABASE db_training;`

## データベースの一覧表示
```
SHOW DATABASES;
```
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/cb4c9c8a-5f2e-6a15-6319-708ba8aa229b.png)
一覧の表示をするので`SHOW DATABASE;`ではなく`SHOW DATABASES`というように複数形になります。

## 使用するデータベースを指定
```
use データベース名;
```

## 使用中のデータベースの確認
```
SELECT DATABASE();
```
こちらはmysql4.1以降らしいです。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/2b6df54b-cb86-20c1-4938-ccaa8766a9ae.png)

または

```
SHOW PRPCESSLIST;
```
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/36b1e2a5-0c7e-d59c-bd6d-a8aad43314c1.png)

## データベースを削除
```
DROP DATABASE データベース名;
```
![training5-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/c84868f5-d611-11e9-e827-c5092612a94e.png)

# テーブルの操作
## テーブルの作成
### useで使用するデータベースを選択している場合
```
CREATE TABLE テーブル名 (
カラム名1 データ型 オプション,
カラム名2 データ型 オプション,
カラム名3 データ型 オプション
);
```
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/9242d7bf-b765-927b-3830-89c93d186674.png)
この画像ではオプションは指定していません。

### 使用するデータベースを選択していない場合
```
CREATE TABLE データベース名.テーブル名 (
カラム名1 データ型 オプション,
カラム名2 データ型 オプション,
カラム名3 データ型 オプション
);
```
この`データベース名.テーブル名`の書き方は他のテーブルの操作にも使えるみたいです。

## テーブルの一覧表示
### useで使用するデータベースを選択している場合
```
show tables;
```
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/31c36424-ea9f-b3d2-a251-7b94bea4fa0c.png)
こちらも複数形で記述します。

### 使用するデータベースを選択していない場合
```
show tables from データベース名;
```

## カラムの一覧表示
```
show columns from テーブル名;
```
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/cb79728f-0e75-5a9a-360b-4ac0e7053b50.png)
もしくは

```
DESC テーブル名;
```

## レコードの挿入(複数行を一気に)
```
INSERT INTO テーブル名 VALUES
(データ1-1, データ1-2, データ1-3),
(データ2-1, データ2-2, データ2-3),
(データ3-1, データ3-2, データ3-3);
```
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/52254a25-de2f-25cb-ff31-8a2dd97d1ee7.png)!

これ以外にも入力するフィールドを指定する方法もあるみたいです。
【参考記事】
[MySQL：INSERTで複数行追加する](http://raining.bear-life.com/mysql-2/insert%E3%81%A7%E8%A4%87%E6%95%B0%E8%A1%8C%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)

## レコードの確認
```
SELECT * FROM テーブル名;
```
[更新前のテーブル]
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/16ee6af5-90c9-12b4-6016-bb7ec81287d3.png)

## レコードを更新
```
UPDATE テーブル名 SET カラム名 = 更新後の値 WHERE 検索条件;
```
例えば、`training_table`の`idが2`のデータの`NAME(katou)`を更新する場合
`UPDATE training_table SET NAME = "itou" WHERE ID = 2;`
検索条件についてはIDでなくても`WHERE NAME = "katou"`でも可能です。

[更新後のテーブル]
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/eb5e6c8c-936a-3d26-b6a8-421131ff0b93.png)

## レコードの削除
```
DELETE FROM テーブル名 WHERE 検索条件;
```
例えば、`training_table`の`idが5`のデータを削除する場合
`DELETE FROM training_table WHERE ID = 5;`

[削除後のテーブル]
![training5-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/7130f1d4-d8e5-ad1a-2519-022f18e9a3cf.png)
(ID4のNAMEが変わっているのは、もう1回UPDATEしただけなので気にしないでください)

## レコードの件数
```
SELECT COUNT(*) FROM テーブル名;
```
この書き方だとNULLが含まれていても関係なくデータの件数を取得します。
他の指定の仕方はこちら↓
【参考記事】
[COUNT関数 (指定したカラムの行数を取得する)](https://www.dbonline.jp/mysql/function/index6.html)

## レコードの抽出
```
SELECT * FROM テーブル名 WHERE 検索条件;
```
例えば、`training_table`の`idが3`のデータを抽出する場合
`SELECT * FROM training_table WHERE ID = 3;`
![training5-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/6ecda42b-b673-a612-b802-66c2eadb68b2.png)

`training_table`の`AGEが28以上`のデータを抽出する場合
`SELECT * FROM training_table WHERE AGE >= 28;`
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/c59fa0a2-49c5-7e83-7ca8-297edb5709db.png)

## テーブルの削除
```
DROP TABLE テーブル名;
```
![training5-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/a1ed49aa-1572-a45c-20ee-8396a331fbad.png)

## カラムの並べ替え
### 特定のカラムの後ろに移動させる時
```
ALTER table テーブル名 modify 移動させるカラム名 そのカラムのデータ型 after 移動後に前にあるカラム名
```
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/ff15aa88-e3be-80b3-dded-ffb36dadb42a.png)
このようなテーブルがあった時に、idをcommentの次に移動させるとします。
`ALTER table training.chat modify id int(11) after comment;`
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/c05b4e21-87b9-d15a-03b1-98cd2a457619.png)
`auto_increment`などのオプションがある場合はそちらも記入しないと移動後に消されてしまいます。
その場合は、`移動させるカラムのデータ型`と`after`の間に記入してください。

### 先頭に移動させる時
```
ALTER table テーブル名 modify 移動させるカラム名 そのカラムのデータ型 FIRST;
```