PR

【SQL】AVG関数(SELECT AVG)を1分でわかりやすく解説

Database

SELECT文で指定したレコードの平均を取得するAVG関数の使い方を初心者向けにわかりやすく1から解説します。

参考 SELECT文

AVG関数は指定したカラムのレコードの平均値を取得します。"AVG" は平均を意味する "Average" の略です。

SELECT AVG(カラム名) FROM テーブル名;
SELECT AVG
図1:AVG関数のイメージ

このページではSQLにおけるAVG関数の利用方法・構文ルールを1からわかりやすく初心者向けにご説明します。

このページで学べる内容
  • AVG関数の使い方・構文ルール
  • GROUP BY句を利用した集計方法

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

SQL:AVG関数の使い方・構文ルール

SELECT AVG(カラム名) FROM テーブル名;

AVG関数の構文ルールはSUM関数と全く同じ。"AVG( )" のように平均値を求めたいカラムを( )で囲むだけ。

ここでは以下のようなテーブルを例にAVG関数の利用方法と処理結果を見ていきます。

SELECT AVG
図2:AVG関数の使い方

成績の一覧テーブルから、Japanaeseカラムのレコードの平均値を取得したい場合は以下のように記述します。

SELECT AVG(Japanaese) FROM PointList;

-- 結果「450」

SUM関数と同様に、複数のカラムを指定して合計値を取得することも可能です。

SELECT AVG(Japanese), AVG(Math), AVG(English)
  FROM PointList;

-- AVG(Japanese)⇒45
-- AVG(Math)    ⇒450
-- AVG(English) ⇒45

参考までにSUM関数のサンプルコードも記載しますが、構文ルールは全く同様です。

SELECT SUM(Japanese), SUM(Math), SUM(English)
  FROM PointList;

-- AVG(Japanese)⇒360
-- AVG(Math)    ⇒3600
-- AVG(English) ⇒360

SUM関数と同様にAVG関数では必ずカラムを指定する必要があります。

ワイルドカード*を使用することはできません。

SELECT AVG(*) FROM PointList;

-- AVG関数の引数には「*」を利用することはできません

AVG関数:NULL値の扱い

SUM関数と同様、AVG関数もNULL値を除外して平均値を計算します。

仮に以下のようなテーブルが存在する場合にAVG関数を利用するとどうなるか?

AVG関数とNULL値
図3:AVG関数とNULL値

AVG関数は、計算の前にNULLの行を除外しその後で平均値を計算するため結果は以下のようになります。

SELECT AVG(Japanese),AVG(Math),AVG(English)
  FROM PointList;

-- AVG「10」/ AVG「100」/ AVG「10」

レコード数自体は8個あるので、10(合計)÷8(レコード数) = 1.25 と出ると誤認される方がいますが、上記でも開設した通り「NULLは計算の前に除外される」ため、計算式は以下のようになります。

10(合計)÷1(レコード数)

データベーススペシャリスト試験などでもよく出題されるポイントなので頭に入れておきましょう!

AVG関数とNULL値
-- テーブルの作成
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    score INT NOT NULL
);

-- レコードの追加
INSERT INTO students (name, score) VALUES
('Alice', 85),
('Bob', 90),
('Charlie', 80),
('David', 95),
('Eva', 78),
('Frank', NULL),
('Grace', NULL),
('Helen', 88);

-- SELECT(AVG)の実行
SELECT AVG(score) AS average_score FROM students;

-- 結果「86」

AVG関数は、デフォルトでNULL値を無視します。つまり、NULL値は平均計算には含まれません。上記の場合は、NULL値を持つ2名の学生(FrankGrace)のスコアは計算に含まれません。

(85+90+80+95+78+88)/6 ​= 86

もし、COALESCE関数を使用することで、NULL値を特定の値(例えば、0)で置き換えて平均を取ることも可能です。

SELECT AVG(COALESCE(score, 0)) AS average_score_with_nulls FROM students;

-- COALESCE関数は、最初の非NULL値を返します。
-- 上記の例では、scoreがNULLの場合は0を返します。
-- したがって、このSQL文はNULL値を0として平均スコアの計算に含めます。

AVG関数:GROUP BY句との合わせ技

AVG関数は "GROUP BY" 句と併用して利用することが可能。

参考 GROUP BY句

一般的なシステムでAVG関数が用いられる場合は "GROUP BY" 句と同時に用いられることが非常に多いため、この使い方も併せて理解しておくと良いでしょう。

先ほどのPointListテーブルに性別を示すカラムを追加して考えてみましょう。

AVG,GROUP BY
図4:AVG関数とGROUP BY

GROUP BY句にFM列を指定して実行した結果がこちら。

SELECT FM, AVG(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | AVG       |
  +----------+-----------+
  | 男       | 10        |
  | 女       | 50        |
  +----------+-----------+
*/

ご覧のように、指定したグループごとに結果を取得してくれます。

男:10(合計)÷1(レコード数)=10

女:350(合計)÷7(レコード数)=50

AVG関数のまとめ
  • AVG関数は指定したカラムの平均値を取得できる
  • NULLは除外して計算される
SELECT AVG(Japanese),AVG(Math),AVG(English)
  FROM PointList;

-- AVG「10」/ AVG「100」/ AVG「10」
  • GROUP BY句と組み合わせて利用することでグループごとに合計値を取得することが可能
SELECT FM, AVG(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | AVG       |
  +----------+-----------+
  | 男       | 10        |
  | 女       | 50        |
  +----------+-----------+
*/

より実践的なサンプルコード

-- テーブルの作成
CREATE TABLE scores (
    id INT PRIMARY KEY,
    student_name VARCHAR(255),
    subject VARCHAR(255),
    score INT
);

-- データの挿入
INSERT INTO scores (id, student_name, subject, score)
VALUES (1, 'John', 'Math', 80);

INSERT INTO scores (id, student_name, subject, score)
VALUES (2, 'John', 'Science', 90);

INSERT INTO scores (id, student_name, subject, score)
VALUES (3, 'Jane', 'Math', NULL);

INSERT INTO scores (id, student_name, subject, score)
VALUES (4, 'Jane', 'Science', 85);

INSERT INTO scores (id, student_name, subject, score)
VALUES (5, 'Bob', 'Math', 70);

INSERT INTO scores (id, student_name, subject, score)
VALUES (6, 'Bob', 'Science', 75);

-- SCORE の平均を取得
SELECT AVG(score) FROM scores;

-- 結果→80

-- SCORE の平均を subject ごとに取得
SELECT subject, AVG(score)
FROM scores
GROUP BY subject;

/* 結果
subject  |          avg
---------|----------------------
Math     | 75.0000000000000000
Science  | 83.3333333333333333

GROUP BY句を使用して科目ごとにscoreの平均値を取得
この例では、MathとScienceの2つの科目ごとの平均値が表示されている

*/

参考 CREATE TABLE / INSERT

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。

タイトルとURLをコピーしました