【MySQL】 データ検索チートシート

# はじめに
SQLコマンド学習中にサンプルデータからデータ引き出しの際にチートシートあればいいなと思いましたので、今回記事として作成いたしました。
実行環境としましてはMySQL8.0になります。

# データの検索
ここからは実際に検索する際に使用するコマンドを記載していきます。
<>で囲まれている部分は中身を都度取り出したいデータによって記述してデータにアクセスしてください。
<>はみやすくするために記述しているだけですので無視してください！
また、今回はMySQL8.0で使えるコマンドのみになりますので、中には他のRDBMSによっては異なる記述パターンもありますのでご了承ください。

## SELECT
### テーブルからカラム表示したい時
列名の部分に*を入れると全ての列を選択する。順番は登録されている順番
```
SELECT　<列名>
FROM <テーブル名>;
```

### テーブルから重複したカラムをひとまとめにして表示したい時
DISTINCTを記述することでその列の重複している分を1つにまとめて表示する。
```
SELECT DISTINCT　<列名>
FROM <テーブル名>;
```
### テーブルからカラム表示するときに表示名を変えたい時
表示名の部分に好きな表示名入れればその列の表示を変えてみやすくできる。
```
SELECT DISTINCT　<列名>　AS　<表示名>
FROM <テーブル名>;
```
## WHERE
### テーブルから条件式にあったカラムを表示したい時
テーブル内で条件式に合うもの選び出し、その中から選択された列を表示する。
whereの後にNOTつければ否定にできる。
条件式の後にIS NULLつけるとNULLの行を選べる。NULL以外を選ぶ場合はNOT NULLです。
```
SELECT　<列名>
FROM <テーブル名>
WHERE <条件>;
```
### テーブルから条件式かつ条件式の時にカラム表示する
WHERE部分の条件式に一致し、かつAND以降の条件式にも一致するデータの検索
```
SELECT　<列名>
FROM <テーブル名>
WHERE <条件>
AND <条件>;
```

### テーブルから条件式または条件式の時にカラム表示する
WHERE部分の条件式に一致もしくはOR以降の条件式に一致するデータの検索
```
SELECT　<列名>
FROM <テーブル名>
WHERE <条件>
OR <条件>;
```
:::note warn
注意
ANDとORではANDが優先されるので一緒検索条件に入れる場合はOR以降の条件を（）囲まないとANDが優先実施されますので注意してください。
:::

### またはの条件が多い場合
ORで条件増える時はINで値を選ぶことができる。NOT INにするとその値以外になる。
```
SELECT　<列名>
FROM <テーブル名>
WHERE <条件> IN <値1, 値２, 値３>;
```
## COUNT・SUM・AVG・MAX・MIN
### テーブル内のデータ数表示する。（引数にカラム与えた場合はnullはカウントしない）
```
SELECT　COUNT <列名>
FROM <テーブル名>
```
### テーブル内の合計値表示する。
```
SELECT　SUM <列名>
FROM <テーブル名>
```
### テーブル内の平均値表示する。
```
SELECT　AVG <列名>
FROM <テーブル名>
```
### テーブル内の最大値・最小値表示する。
```
SELECT　MAXもしくはMIN <列名>
FROM <テーブル名>
```
## GROUP BY
### テーブルをグループに切り分ける
テーブル全体を一つと見ていたものをカラムごとのグループに切り分けることが可能
```
SELECT　<列名>
FROM <テーブル名>
GROUP BY <列名>;
```
わかりずらいのでchatgptに例文書いてもらいました。
下記は従業員テーブルから、各部署の平均年齢を取得するsql文です。
employees_tableからdepartment列とage列を選択しており、age列はAVGで平均をとっております。
その結果をdepartment列でグループ化している流れです。department列は部署なので人事部や営業部等々あるのでdepartment列の同名カラム毎にまとめて表示しています。

```sql:
SELECT department, AVG(age) 
FROM employees_table
GROUP BY department;
```

## HAVING
単なる行に対する条件はWHERE句にグループに対する条件はHAVING句に書くという使い分け。
```
SELECT　<列名>
FROM <テーブル名>
GROUP BY <列名>
HAVING <グループ化した値に対する条件>;
```
:::note warn
注意
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY
が実行順序になりますのでGROUP BYの後にWHEREを記述するとエラーになります！
:::

## ORDER BY
### データ選択の順番に意味を持たせる（昇順）
下記記述でORDER BY移行に選んだ列を基準に昇順になります。
正式にはASCがつきますが省略可能です。
```
SELECT　<列名>
FROM <テーブル名>
ORDER BY <並べ替えの基準となる列>;
```
### データ選択の順番に意味を持たせる（降順）
DESCを最後につけると降順になる。複数指定可能。左から処理されるので次に評価されるので、
もし基準列に同じ値があった場合に他の列を次の基準としたい場合は
<並べ替えの基準となる列>, <次の基準となる列>のようにカンマ区切りで実行できます。
```
SELECT　<列名>
FROM <テーブル名>
ORDER BY <並べ替えの基準となる列> DESC;
```

# おわりに
データベースは難しいですね、、、
奥が深い、、、
まだまだ他にもコマンドありますが現状最低限度書きましたのでまた、
自分のためにチートシート作成したいと思います！
最後まで見ていただきありがとうございました！
下記参考文献になります。クリックするとAmazonサイトに飛びますので是非ご覧ください。
[SQLゼロから始めるデータベース操作](https://www.amazon.co.jp/SQL-%E7%AC%AC2%E7%89%88-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798144452 "")
[達人に学ぶSQL徹底指南書](https://www.amazon.co.jp/s?k=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6+sql%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8&adgrpid=48836428930&hvadid=655124822051&hvdev=c&hvlocphy=1009523&hvnetw=g&hvqmt=e&hvrand=18356053589658202992&hvtargid=kwd-335112034228&hydadcr=4076_13322419&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_8tbp7cddit_e "タイトル")