mySQLのコマンドあれこれ

## データベースとテーブルの違い
どちらもデータを入れる箱には違いないが、実際にデータを入れておく箱が「テーブル」に該当する。

イメージとしてデータベースが銀行、テーブルが銀行の中にある金庫にあたる。

銀行はお金をしまっておく以外にも、いろいろとやることがあり、実際にお金をしまっておくのは、銀行の中にある金庫である。

同様にデータベースは、データをしまっておく以外にも色々とやることがあり、実際にデータをしまっておくのは、データベースの中にあるテーブルである。

## データベース確認・選択コマンド
```sql
#確認
mysql> show databases; 

#上記の確認画面からデータベースを選択
mysql> use データベース名;
```

## テーブル一覧
```sql
mysql> show tables;
```

## カラム確認
```sql
mysql> DESC テーブル名;
```

## テーブル内に関するコマンド
#### SELECT
``*``を指定することですべてのカラムを取得する。``name``を指定することで``name``カラムだけを取得することもできる
```sql
mysql> SELECT * FROM users;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | キツネ    |
|    2 | タヌキ    |
|    3 | ネコ      |
|    4 | イヌ      |
|    5 | ヒツジ    |
+------+-----------+
5 rows in set (0.00 sec)

mysql> SELECT name FROM users;
+-----------+
| name      |
+-----------+
| キツネ    |
| タヌキ    |
| ネコ      |
| イヌ      |
| ヒツジ    |
+-----------+
5 rows in set (0.00 sec)
```

#### WHERE
``SELECT``コマンドで、条件に一致したレコードだけを取得したいときは、``WHERE``句を使う。

```sql
mysql> SELECT * FROM users WHERE name = 'ヒツジ';
+------+-----------+
| id   | name      |
+------+-----------+
|    5 | ヒツジ    |
+------+-----------+
1 row in set (0.00 sec)
```

#### GROUP BY
グループ化を行うために使用される。
``GROUP BY [グループ化するカラム名]``で絞れる。
```sql
mysql> SELECT team, COUNT(team) FROM user GROUP BY team;
+------------+-------------+
| team       | COUNT(team) |
+------------+-------------+
| チームA    |           3 |
| チームB    |           2 |
+------------+-------------+
```
注意点として、今回は``team``でグループ化を行ったので、``team``とそのカウントのみを、``select``の表示対象とする必要がある。

例えば``team``でグループ化しているのに、``name``を表示しようとしたなんて場合はエラーとなる。

またグループ化した後に、さらにデータ検索を``HAVING``で行うことができる。``WHERE``と同じ作用をしてくれるもの。
``WHERE``と``HAVING``の違いは、**``GROUP BY``の影響の前後に条件が適応されるか**の違いである。

``WHERE``が``GROUP BY``の影響の**前**に条件が適応され、
``HAVING``が``GROUP BY``の影響の**後**に条件が適応される。

つまり``WHERE``は「グループ化される前に、特定ユーザーを省く」時などに使用することになり、逆に　``HAVING``はグループ化された後に反映されるため「人数の少ないグループを表示から省く」なんてことに利用できる。

```sql
mysql> SELECT team,COUNT(team) AS team_num FROM user GROUP BY team HAVING 3 <= team_num;
+------------+----------+
| team       | team_num |
+------------+----------+
| チームA    |        3 |
+------------+----------+
```

#### OEDER BY
昇順・降順に並び替える時に使う。
``ORDER BY [並び替えるカラム名] [昇順・降順の指定];``で使用できる。
``ASC``が昇順、``DESC``が降順となる。

```sql
mysql> SELECT * FROM user ORDER BY id DESC;
+------+--------------+
| id   | name         |
+------+--------------+
|    5 | ワタナベ     |
|    4 | タカハシ     |
|    3 | タナカ       |
|    2 | スズキ       |
|    1 | ヤマダ       |
+------+--------------+
```

``WHERE``も同時に指定できる。同時に使用する場合の注意点としては、**先に``WHERE``を書く必要がある**。例えば上記の命令に「idが3より大きい」という条件を付け加えら場合、以下のようになる。

```sql
mysql> SELECT id,name FROM user WHERE 3 < id  ORDER BY id DESC;
+------+--------------+
| id   | name         |
+------+--------------+
|    5 | ワタナベ     |
|    4 | タカハシ     |
+------+--------------+
```

``GROUP BY``とも同時に使用が可能。例えば、同一名ごとにグループ化して、その数を表示かつ、その数でソートをしたい場合は、以下のようになる。
```sql
mysql> SELECT name,count(name) as name_num FROM game_character GROUP BY name ORDER BY name_num DESC;
```

## DISTINCT
``SELECT``文の実行結果の重複レコード(データ行)を1つにまとめるに使う。
``SELECT DISTINCT カラム名 FROM テーブル名``で使える。

```sql
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| 鈴木       | 太郎       |
| 鈴木       | 花子       |
| 鈴木       |　　次郎       |
+-----------+------------+

mysql> SELECT DISTINCT last_name from sample1_employees;
+-----------+
| last_name |
+-----------+
| 鈴木       |
+-----------+
1 row in set (0.00 sec)
```
``DISTINCT``して検索したレコード件数を数える``COUNT``関数を併用することができる。
``SELECT COUNT(列名) FROM テーブル名``で使用できる。
```sql
mysql> SELECT COUNT(DISTINCT last_name) from sample1_employees;
+---------------------------+
| COUNT(DISTINCT last_name) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)
```
#### 日付検索
**年月での抽出**
```sql
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%Y%m')=201901;
```
**年での抽出**
```sql
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%Y')=2019;
```
**月での抽出**
```sql
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%m')=7;
```

## 参考記事
[「データベース」と「テーブル」の違い](https://wa3.i-3-i.info/diff528db.html)
[【初心者でも簡単】MySQLコマンドの使い方！DBやテーブルをSQLで操作しよう！](https://kitsune.blog/mysql-command#%E3%83%87%E3%83%BC%E3%82%BF%E6%A4%9C%E7%B4%A2)
[SQLで並び替え!ORDER BYを基礎から応用まで学ぼう!](https://www.sejuku.net/blog/72918)
[【SQL】GROUP BYで自在に集計!集計関数やHAVINGと合わせて使おう](https://www.sejuku.net/blog/72923)
[【SQL入門】DISTINCTで重複行をまとめる方法をわかりやすく解説](https://www.sejuku.net/blog/54990)
[[MySQL]月・年単位でデータを抽出する方法 （DATE_FORMAT）](https://www.searchlight8.com/mysql-year-month-date_format/)