CodeGym /コース /SQL SELF /平均値と AVG() — カラムごとの平均値の計算

平均値と AVG() — カラムごとの平均値の計算

SQL SELF
レベル 7 , レッスン 3
使用可能

もし今までにテストの平均点とか、例えば部署の平均給料を計算しようとしたことがあるなら、もうすでに平均値(算術平均)のコンセプトは知ってるよね。まあ、学校でもよく習うし。SQLでは、データセットの平均値を計算するタスクは全部 AVG() 関数で解決できるんだ。

AVG() 関数は、数値カラムの算術平均を計算する集約関数だよ。指定したカラムの全ての値を足して、その値の個数で割るだけ。ちなみに NULL は無視される(この無視が意外と便利なんだけど、それは後で説明するね)。

AVG() のシンタックス

まずは基本のシンタックスからいこう:

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

ここで カラム は、平均を出したい数値が入ってるカラムのことだよ。

例1: 社員の平均給料

例えば、employees という社員と給料のデータが入ってるテーブルがあるとする:

id name salary
1 Otto 50000
2 Maria 60000
3 Alex 55000
4 Anna NULL
5 Dan 52000

平均給料を計算するシンプルなクエリ:

SELECT AVG(salary) AS average_salary
FROM employees;

結果:

average_salary
54250

どうやって計算されてる?

  • AVG() は給料を全部足す:50000 + 60000 + 55000 + 52000 = 217000。
  • NULLじゃない値の数で割る:217000 / 4 = 54250。

AVG()NULL の特徴

気づいたかもだけど、平均給料を計算するときに salary カラムの NULL は無視されてる。これが AVG() の大事な特徴。NULLじゃない値だけが計算に使われるんだ。

ちょっと例を見てみよう:

SELECT AVG(NULL) AS result;

結果:

result
NULL

これで AVG()NULL を無視するってことがまた分かるよね。でも、もしデータセット全部が NULL だけだったら、結果も NULL になる。

でも、もしテーブルに NULL じゃなくて 0 が入ってたら、その値は無視されないよ。

employees テーブル

id salary
1 1000
2 0
3 NULL
4 2000

SQLクエリ:

SELECT AVG(salary) AS avg_salary
FROM employees;

結果:

avg_salary
1000

なんでこうなるの?

だって AVG() はこう計算するから:

[(1000 + 0 + 2000) / 3 = 1000]

NULL の行は平均値の計算から外される。

例: 学生の平均年齢を計算

今度は students テーブルを見てみよう:

id name age
1 Anna 20
2 Max 22
3 Maria NULL
4 Otto 21

クエリ:

SELECT AVG(age) AS average_age
FROM students;

結果:

average_age
21
  • AVG() は Maria さんを無視する。だって彼女の年齢は NULL だから。
  • 平均値はこう計算される:(20 + 22 + 21) / 3 = 21。

結果の丸め方

たまに AVG() の結果が小数点以下まで出てくることがあるよね。

もし丸めた数字が欲しいなら、ROUND() 関数を使えばOK。

employees テーブル

id salary
1 50000
2 60000
3 47000
4 NULL

SQLクエリ

SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;

結果

rounded_average_salary
52333.33

NULL の行は計算から外されるから、平均は3つの値で計算されるよ。

平均値計算前のデータフィルタリング

もし特定の条件に合う値だけで平均を出したいなら、WHERE を使おう。

employees テーブル

id salary
1 50000
2 60000
3 47000
4 60000
5 NULL

例: id > 2 の社員の平均給料を出す

SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;

結果

average_salary
53500

計算に使われるのは id = 3id = 4 の給料だけ。NULL の行は除外される。

例: AVG() を使った複雑なクエリ

AVG() は他の集約関数や演算子と組み合わせて使うこともできるよ。

例えば、sales という売上テーブルがあるとする:

sale_id product quantity price
1 スマホ 2 500
2 ノートパソコン 1 1500
3 タブレット 3 300

売上合計の平均を計算するクエリ:

SELECT AVG(quantity * price) AS average_total_sale
FROM sales;

結果:

averagetotalsale
950

実用的なライフハックとよくあるミス

AVG() を使うときは、よくあるミスを避けるために注意しよう:

NULL値:結果が思ったより小さいときは、AVG()NULL の行をスキップしてることを思い出して!

データ型の混在:カラムに数字とテキストが混ざってると(これはそもそも良くないけど)、AVG() はエラーになるよ。

2
タスク
SQL SELF, レベル 7, レッスン 3
ロック未解除
学生の平均年齢をシンプルに計算しよう
学生の平均年齢をシンプルに計算しよう
2
タスク
SQL SELF, レベル 7, レッスン 3
ロック未解除
給与条件付きの従業員の平均給与を計算する
給与条件付きの従業員の平均給与を計算する
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION