もし今までにテストの平均点とか、例えば部署の平均給料を計算しようとしたことがあるなら、もうすでに平均値(算術平均)のコンセプトは知ってるよね。まあ、学校でもよく習うし。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 = 3 と id = 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() はエラーになるよ。
GO TO FULL VERSION