SQLの基礎について学ぶ＃０７

今回は<b>集計</b>と<b>グループ化</b>について説明していきたいと思います！！
### 過去の関連投稿
「[SQLの基礎について学ぶ＃０１](https://qiita.com/TAISEI-050523/items/31dd74cd386fe4dc46bf "Qiita")」
「[SQLの基礎について学ぶ＃０２](https://qiita.com/TAISEI-050523/items/75265fba015879bd3bf8 "Qiita")」
「[SQLの基礎について学ぶ＃０３](https://qiita.com/TAISEI-050523/items/2d87b30fa3de353af159 "Qiita")」
「[SQLの基礎について学ぶ＃０４](https://qiita.com/TAISEI-050523/items/6c4509276613d5eee488 "Qiita")」
「[SQLの基礎について学ぶ＃０５](https://qiita.com/TAISEI-050523/items/845bbdd046e28b443090 "Qiita")」
「[SQLの基礎について学ぶ＃０６](https://qiita.com/TAISEI-050523/items/bd9effcebe1b0ced652c "Qiita")」

## 1. 代表的な集計関数
| 関数名 |    説 明    |
|:-----:|:------------:|
|  SUM  | 各行の値の合計値を求める |
|  MAX  | 各行の値の最大値を求める |
|  MIN  | 各行の値の最小値を求める |
|  AVG  | 各行の値の平均値を求める |
| COUNT | 行数をカウントする       |
### accountテーブル
|    date（日付）    |    name（項目名）       |    price（金額）     |
|:-----------:|:------------:|:------------:|
| 2020-12-03 |　食費  　 | 800         |
| 2021-01-03 |　交通費 　 | 600         |
| 2021-05-22 |　食費  　 | 1000         |
| 2021-03-14 |　日用品  　 | 1400         |
###① さまざまな集計関数
```SQL
SELECT 
  SUM(price) AS total
  MAX(price) AS maximum
  MIN(price) AS minimum
  AVG(price) AS average
FROM account
```
###結果
|    total    |    maximum      |   minimum     | average |
|:-----------:|:------------:|:------------:|:------------:|
| 3800 |　　　1400  　 | 600         |950
###② 行数を集計関数
``COUNT(*)`` => ``検索結果の行数``
``COUNT(列名)`` => ``検索結果の指定列に対する行数``

```SQL
SELECT COUNT(*) AS '食費の桁数'
  FROM account
 WHERE name = '食費'
```
###結果
|  食費の桁数  |
|:----------:|
|2|
###③ COUNT(*)とCOUNT(列名)の違い
・``COUNT(*)``は、行数をカウントする（NULLもカウント）。
・``COUNT(列名)``は指定した列がNULLである行を無視してカウントする。

##2. 集計関数に関する注意点
###① 集計関数は、``SELECT文``の選択列リストか``ORDER BY句``または``HAVING句``にのみ記述できる。

###② 引数に渡せる型が異なる

|    関数名    |    数値型       |    文字列型     | 日付型     |
|:-----------:|:------------:|:------------:|:------------:|
| SUM |　各数値の合計  　 | ✖         |　✖
| MAX |　各数値の最大 　 | 検索結果の最後の文字列         |最も新しい日付
| MIN |　各数値の最小  　 | 索結果の最初の文字列          |最も古い日付
| AVG |　各数値の平均  　 | ✖         |✖
| COUNT |　行数  　 | 行数         |行数

##3. データのグループ化
グループ化は指定いた基準で検索結果をいくつかの<B>まとまりに分ける機能</B>です。
### accountテーブル
|    date（日付）    |    name（項目名）       |    price（金額）     |
|:-----------:|:------------:|:------------:|
| 2020-12-03 |　食費  　 | 800         |
| 2021-01-03 |　交通費 　 | 600         |
| 2021-05-22 |　食費  　 | 1000         |
| 2021-03-14 |　日用品  　 | 1400         |
| 2020-12-03 |　食費  　 | 700         |
| 2021-01-03 |　交通費 　 | 1200         |
| 2021-05-22 |　交通費  　 | 1000         |
| 2021-03-14 |　日用品  　 | 400         |
###① グループ化して集計する構文
```SQL
SELECT グループ化の基準列名, 集計関数
 FROM テーブル名
 (WHERE 絞り込み条件)
GROUP BY グループ化の基準列名
```
```SQL
SELECT name, SUM(price) AS price_total
 FROM account
GROUP BY name
```
###結果
|   name   |    price_total     |
|:------------:|:------------:|
|　食費  　 | 2500         |
|　交通費 　 | 2800         |
|　日用品  　 | 1800         |
###ポイント
・グループ化するには、``GROUP BY句``で基準となる列を指定
・集計関数によって、データ値を``グループ毎``にまとめて計算
・結果の行数は、``グループの数(今回はname)と一致``
・WHERE句を処理する段階では、まだ集計していないため、集計関数は``WHERE句を利用することはできない``。集計処理を行った後に結果表に対して、絞り込みを行う場合は``HAVING句``を用いる。

###② グループ化してから絞り込む構文
``HAVING句``に用いる条件式はWHERE句に用いる条件式に似ています。``AND``や``OR``を用いることができます。ただし、両者の絞り込みを行う``タイミングが異なります``。
###基本構文
```SQL
SELECT グループ化の基準列名, 集計関数
 FROM テーブル名
 (WHERE 絞り込み条件)
GROUP BY グループ化の基準列名
HAVING 集計結果にに対する絞り込み条件
```
###金額の合計値が2000円以上のものに絞り込む
```SQL
SELECT name, SUM(price) AS price_total
 FROM account
GROUP BY name
HAVING SUM >= 2000    /* 合計値が2000円以上のものに絞り込む */
```
###結果
|   name   |    price_total     |
|:------------:|:------------:|
|　食費  　 | 2500         |
|　交通費 　 | 2800         |


##3. まとめ
　今回は以上になります。何か間違い等ありましたら、コメントお願いします。引き続きSQLについて学んでいきたいと思います。