これまでは、4つのSQL文を使ったデータの取得・WHERE句による行の絞り込み・検索結果の加工をしてきたが、集計関数を使ってSELECT文で取得したデータを「集計」することもできる。
集計関数
よく使われる集計関数
集計関数は基本的にはSELECT文で使われる。よく使う集計関数は下記の通り
関数 | 役割 |
SUM | 各行の合計を求める |
MAX | 各行の最大値を求める |
MIN | 各行の最小値を求める |
AVG | 各行の平均を求める |
COUNT | 行数を求める |
実際に使うとこんな感じ
1 2 3 4 5 6 |
SELECT SUM(支出額) AS 合計 -- 支出額(列)の合計金額 MAX(支出額) AS 最高額 -- 支出額(列)の最高金額 MIN(支出額) AS 最低額 -- 支出額(列)の最低金額 AVG(支出額) AS 平均額 -- 支出額(列)の平均金額 FROM 家計簿 |
取得してきた値はこんな感じで取得できる
合計 | 最高額 | 最低額 | 平均額 |
15740 | 7560 | 0 | 3148 |
COUNT関数はこんな感じ
1 2 3 4 |
SELECT COUNT(*) AS 交際費の行数 FROM 家計簿 WHERE 費目 = '交際費' #COUNT(*)はNULLも行数にカウントし、COUNT(列名)はNULLをカウントしない |
はじめてのSQL③(検索結果の加工)で出てきたDISTINCTを使うと、重複している値を除外して集計できる。
1 2 |
SELECT COUNT(DISTINCT 費目) FROM 家計簿 |
NULLの扱いについて
集計関数によって、NULLの扱い方が違う。
集計関数 | NULLの扱い方 | 全行がNULLの場合 |
SUM | NULLは無視 | NULLを返す |
MAX | NULLは無視 | NULLを返す |
MIN | NULLは無視 | NULLを返す |
AVG | NULLは無視 | NULLを返す |
COUNT(列名) | NULLは無視 | 0 |
COUNT(*) | NULLも含めてカウント | NULLも含めた行数 |
NULLは無視されることが多いが、平均額等(合計金額÷使った回数)を求めるときは金額がNULLであっても使った回数にカウントしないと計算ができないので、COALESCE関数を使う。
1 2 3 |
SELECT AVG(COALESCE(支出額, 0)) AS 支出額の平均 FROM 家計簿<br /> |
グループ集計
GROUP BY句
GROUP BY句は項目別に集計したいときに便利
1 2 3 4 |
SELECT 支出用途, SUM(支出額) AS 支出金額の合計 FROM 家計簿 GROUP BY 支出用途 -- 支出用途でグループ化 |
イメージはこんな感じ

GROUP BY句は複数の列を指定することもできる。以下はMySQLの例https://dev.mysql.com/doc/refman/5.6/ja/group-by-modifiers.html

HAVING句
集計結果に対して、絞り込みをしたいときはWHERE句ではなく、HAVING句を使う。
WHERE句はデータを検索する際に絞り込み、HAVING句は集計後データを絞り込む役割がある。
1 2 3 4 |
SELECT 支出用途, SUM(支出額) AS 支出金額の合計 FROM 家計簿 GROUP BY 支出用途 -- 支出用途でグループ化 HAVING SUM(支出額) > 0 -- 集計後の支出額が0円以上のものだけを取得・表示 |
集計テーブル
将来的に何万件、何十万件といった大量のデータを扱う際は集計テーブルを作ると良いかもしれない。
簡単に言うと、集計したデータを別テーブルに保存(INSERT INTO)しておくことで、後で簡単に集計結果のデータを取り出すことができるから。
SELECT文や集計関数を使って毎回処理することもできるが、SQL文は基本的には一行ずつ処理をしていくから、行数が増えれば増えるほど、処理に時間がかかるし、負荷が大きくなりそう。

集計テーブルの難点としては、定期的に更新しておかないと、古い集計データを取得してしまうことになるので、分析結果がズレる可能性があるので、その点は注意しておくと良いかも。