MySQL勉強まとめ2

# 概要
[MySQL勉強まとめ](https://qiita.com/iwhg0211/items/6e577f930ce3675822f7)の続きです。
個人的な勉強のまとめなので、もし修正があればご指摘いただけるとありがたいです。

# 目次
- テーブルの結合
- 全体の実行順序
- NULLもデータとして取得するための方法
- 名前を含むカラムの取得
- 四則演算
- 演算子


# テーブルの結合
```MySQL:ターミナル
SELECT players.name,countries.name
FROM players(テーブル名１)
JOIN countries（テーブル名２）
ON prayers.country_id（カラム名１） = countries.id（カラム名２）;
```
↑の例で見るとplayersテーブルとcountriesテーブルを結合させる。
country_idとidが同じものを指しているから、別のテーブルでも結合が可能です！
また、SELECTでは「テーブル名.カラム名」とすることで選ぶカラムを指定できます！

# 全体の実行順序

1. テーブルの指定 FLOM
1. 結合 ON, JOIN
1. 取得条件 WHERE
1. グループ化 GROUP BY
1. 関数　COUNT, SUM, AVG, MIN, MAX...
1. HAVING
1. 検索 SELECT, DISTINCT
1. 順序 ORDER BY
1. LIMIT

# NULLもデータとして取得するための方法

```MySQL:ターミナル
SELECT *
FROM players
LEFT JOIN teams
-- LEFT JOINでNULLのデータも取得する
ON players.previous_team_id = teams.id;
```
|選手のid|選手名|選手のgoal数|選手の身長|選手の出身国id|選手が前年度所属していた別チーム|チームのid|チーム名|
|--|----|-----|------|----------|-----------------|--|----|
|id|name|goals|height|countris_id|previous_teams_id|id|name|
|1 |山田 |1    |189cm |1          |3                |3 |レッドソックス|
|２ |山中 |5    |199cm |3          |                 |  | |
|3 |真中 |65   |200cm |6          |2                |2 |ヤンキース|

こんな感じでLEFT JOINで結合すれば、NULLのデータも取得してくれます。

# 名前を含むカラムの取得

```MySQL:ターミナル
SELECT *
FROM items
WHERE name LIKE '%シャツ%';
```
WHERE カラム名 LIKE '%含みたい文字列%';
で名前を含むものを検索できます。

# 四則演算

```MySQL:ターミナル
SELECT name,price-cost
FROM items
ORDER BY price-cost DESC
LIMIT 5;
```
「price-cost」で利益の計算ができます。AVG(price-cost)など関数との併用も可能です。
もちろんpriceやcost以外のあらゆるカラムで四則演算は可能です。

「ORDER BY カラム名 DESC」で高い順にデータを並べる
※「ORDER BY カラム名 ASC」で低い順にデータを並べる
「LIMIT 数字」で表示するデータ数を決める

こんな感じです。

# 演算子

#### LIKE演算子

その文字を含んだデータを獲得するための演算子

sweetsテーブル
|id|name|
|-|-|
|1|ショートケーキ|
|2|チョコケーキ|
|3|ケーキクリーム|
|4|焼きプリン|
|5|プリンクリーム|
|6|ケーキ|
|7|プリン|


```MySQL:ターミナル
SELECT *
FROM sweets
WHERE sweets LIKE "%ケーキ%";
```

|id|name|
|-|-|
|1|ショートケーキ|
|2|チョコケーキ|
|3|ケーキクリーム|
|6|ケーキ|

取り出したい文字列を「%００%」で囲むと、囲まれた文字列を含んだデータを取り出すことができます。


```MySQL:ターミナル
SELECT *
FROM sweets
WHERE sweets LIKE "ケーキ%";
```
ケーキの後ろにどのような文字列が来ても、取り出すことができます。（後方一致と言います）

|id|name|
|-|-|
|3|ケーキクリーム|
|6|ケーキ|


```MySQL:ターミナル
SELECT *
FROM sweets
WHERE sweets LIKE "%プリン";
```
プリンの前にどのような文字列が来ても、取り出すことができます。（前方一致と言います）

|id|name|
|-|-|
|5|プリンクリーム|
|7|プリン|

#### NOT演算子

```MySQL:ターミナル
SELECT *
FROM sweets
WHERE NOT sweets LIKE "%ケーキ%";
```

sweetsテーブル
|id|name|
|-|-|
|4|焼きプリン|
|5|プリンクリーム|

```MySQL:ターミナル
SELECT *
FROM sweets
WHERE NOT sweets LIKE "%プリン%";
```

|id|name|
|-|-|
|4|焼きプリン|
|5|プリンクリーム|
|7|プリン|

#### NULL

NULL(空白)のデータの取得をする

```MySQL:ターミナル
SELECT *
FROM purchases
WHERE price IS NULL;
```

これで、priceがNULLのデータを取得できる。

#### NOT NULL

NULL(空白)でないデータの取得をする

```MySQL:ターミナル
SELECT *
FROM purchases
WHERE price IS NOT NULL;
```

これで、priceがNULLでないデータを取得できる。

#### AND, OR演算子

sweetsテーブル
|id|name|color|
|-|-|-|
|1|ショートケーキ|白|
|2|チョコケーキ|黒|
|3|ケーキクリーム|白|
|4|焼きプリン|茶色|
|5|プリンクリーム|黄色|
|6|ケーキ||
|7|プリン|黄色|

```MySQL:ターミナル
SELECT *
FROM sweets
WHERE  color = '白' AND name = '%ケーキ%';
```

ANDを使うと、この２つを含んだデータを選択することができる。

|id|name|color|
|-|-|-|
|1|ショートケーキ|白|
|3|ケーキクリーム|白|

```MySQL:ターミナル
SELECT *
FROM sweets
WHERE  color = '白' OR name = '%ケーキ%';
```

|id|name|color|
|-|-|-|
|1|ショートケーキ|白|
|2|チョコケーキ|黒|
|3|ケーキクリーム|白|
|6|ケーキ||

こんな感じです。