📌 結論から理解する
集計関数=「複数の行を1つの値にまとめる関数」
集計関数はGROUP BYと組み合わせて使うことが多いですが、GROUP BYなしでも「全体」を集計する場面で使えます。
主要集計関数の一覧
| 関数 | 意味 | NULLの扱い |
|---|---|---|
COUNT(*) | 行数(NULLを含む全行) | NULLも数える |
COUNT(列名) | その列がNULLでない行数 | NULLを除外して数える |
SUM(列名) | 合計値 | NULLを無視 |
AVG(列名) | 平均値 | NULLを除いた値の平均 |
MAX(列名) | 最大値 | NULLを無視 |
MIN(列名) | 最小値 | NULLを無視 |
NULLの扱いに要注意
salaryテーブル: 100, 200, NULL, 300, NULL
| 関数 | 結果 | 理由 |
|---|---|---|
| COUNT(*) | 5 | 全行数(NULL含む) |
| COUNT(salary) | 3 | NULL以外の行数 |
| SUM(salary) | 600 | 100+200+300(NULLを無視) |
| AVG(salary) | 200 | 600÷3(NULLを除外して計算) |
| MAX(salary) | 300 | 最大値(NULL無視) |
AVGはNULLを除いた行で平均を計算します。NULLを0として扱うわけではありません。「5件でNULLが2件あればAVGは残り3件の平均」が正解。
DISTINCTと集計関数の組み合わせ
-- 重複を除いた顧客数
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM orders;
-- 重複を除いた種類の合計金額(稀な使い方)
SELECT SUM(DISTINCT price) FROM products;
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM orders;
-- 重複を除いた種類の合計金額(稀な使い方)
SELECT SUM(DISTINCT price) FROM products;
COUNT(*) と COUNT(列名) の違いが頻出。「NULLを含む全件数はCOUNT(*)、NULLを除く件数はCOUNT(列名)」。
🧠 確認クイズ
Q1. salary列に値 100, 200, NULL, 300 がある場合、AVG(salary) の結果はどれか?
Q2. COUNT(*)とCOUNT(column_name)の違いとして正しいのはどれか?
Q3. COUNT(DISTINCT customer_id) の意味として正しいのはどれか?