MySQL の集計関数 - MIN()・MAX()・AVG()
ここでは MySQL のよく使う集計関数の MIN()、MAX()、AVG() についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の 集計関数 MIN() と MAX() の使い方
MySQL の MIN() は、SELECT 文 で使い、結果セットの中で指定したカラムの最小値を返す集計関数です。
MAX() も、同様に SELECT 文 で使い、結果セットの中で指定したカラムの最大値を返す集計関数です。
SELECT MIN(カラム名),
MAX(カラム名)
FROM テーブル名
WHERE ...
それでは、MIN() と MAX() を使ってデータを取得してみましょう。
次のような exam_results テーブルがあります。
例えば、この exam_results テーブルの exam_id が 2 の score の最低点と最高点を取得したい時は次のように取得できます。
SELECT MIN(score),
MAX(score)
FROM exam_results
WHERE exam_id = 2;
[実行結果]
exam_id = 2 の score の最低点 77 と最高点 91 が取得できていますね。
exam_id ごとの score の最低点と最高点を取得したい時は GROUP BY と MIN(score)、MAX(score) を使って、次のように取得できます。
SELECT exam_id,
MIN(score),
MAX(score)
FROM exam_results
GROUP BY exam_id;
[実行結果]
MySQL の 集計関数 AVG() の使い方
MySQL の AVG() は結果セットのなかで、指定したカラムの平均値を返してくれる集計関数です。
SELECT AVG(カラム名)
FROM テーブル名
WHERE ...
例えば、以下の exam_results テーブルから、exam_id が 1 の score の平均値は次のように取得できます。
SELECT AVG(score)
FROM exam_results
WHERE exam_id = 1;
[実行結果]
(85 + 60 + 98 + 73) / 4 = 79 なので、正しく取得できていますね。
少し気をつけなければいけないのは、値に NULL が入っているときの動きです。
exam_id が 2 のレコードは 4 つありますが、その中のひとつのレコードの score が NULL になっています。
その状態で AVG(score) を取得すると、値は 4 で割られるのではなく、 3 で割られ、(77 + 92 + 81) / 3 の計算結果 の 83.3333 が返ってきます。
SELECT AVG(score)
FROM exam_results
WHERE exam_id = 2;
[実行結果]
もし NULL を 0 点として平均値をとりたい場合は、COALESCE() 関数などで NULL を 0 に変換して AVG() を使うと (77 + 0 + 92 + 81) / 4 の値が取得できます。
SELECT AVG(COALESCE(score, 0))
FROM exam_results
WHERE exam_id = 2;
[実行結果]
また、MIN・MAX の時と同様に、GROUP BY と AVG() を一緒に使って、exam_id ごとの score の平均値も取得できます。
SELECT exam_id,
AVG(COALESCE(score, 0))
FROM exam_results
GROUP BY exam_id;
[実行結果]
最後に、結果セットにレコードがなかった時は、MIN()・MAX()・AVG() 共に NULL を返します。
SELECT MIN(score),
MAX(score),
AVG(score)
FROM exam_results
WHERE exam_id = 0;
[実行結果]
以上、MySQL のよく使う集計関数の MIN()、MAX()、AVG() についてご説明しました。