📊 SQLのデータ分析「集計関数」
皆さん、こんにちは!
これまでは「行」を絞り込んだり、並び替えたりする方法を学びました。しかし、データベースの真の力は「集計(たくさんのデータをまとめて計算すること)」にあります。
今回は、データの塊から「最大値」「平均」「個数」などの単一の結果を導き出す「集計関数(Aggregate Functions)」を紹介します。
📈 第1章:集計関数の基本構造と役割
1-1. 集計関数とは?
集計関数とは、複数の行(値のセット) に対して操作を行い、その結果をたった一つの値(スカラー値) として返す関数です。
1-2. 代表的な集計関数(MAX, MIN, AVG, SUM)
【実行例:最大売上総額を見つける】
SELECT MAX(TotalDue)
FROM Sales.SalesOrderHeader;
-- 結果:テーブル内で最大のTotalDue値(例:187487.825)が一つだけ返される。
🔢 第2章:特殊な集計関数 COUNT() の使い方
COUNT()関数は、行の数を数えるために使われますが、少し特殊な挙動をします。
2-1. 行の総数を数える:COUNT(*)
テーブル全体の行数を数えたい場合は、アスタリスク * を使います。これが最も一般的な使い方です。
SELECT COUNT(*)
FROM Sales.SalesOrderHeader;
-- 結果:テーブルに含まれる全行数(例:31465行)
👉 メリット: SELECT * と違い、実際にデータをすべて取り出すわけではないので、非常に高速です。
2-2. NULL値を除外して数える:COUNT(カラム名)
COUNT()の括弧の中にカラム名を入れると、「NULLではない値」が入っている行だけを数えます。
【例】
SELECT COUNT(SalesPersonID) -- SalesPersonIDに値が入っている行だけを数える
FROM Sales.SalesOrderHeader;
-- 結果:SalesPersonIDが NULL ではない行の数(例:209行)が返される。
これは、以下のクエリと同じ結果になります。
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL;
2-3. 重複を排除して数える:COUNT(DISTINCT カラム名)
ユニーク(重複していない)な値の数だけを数えたい場合に、DISTINCTキーワードを使います。
【例】 Person.PersonテーブルのFirstName(名)列にある、ユニークな名前の種類を数える。
SELECT COUNT(DISTINCT FirstName)
FROM Person.Person;
-- 結果:テーブルに登場する「異なる名前」の総数(例:1018種類)
🎯 第3章:集計関数とWHERE句の組み合わせ
集計関数は、全行に対して計算を行うのが基本ですが、WHERE句を使えば、計算対象の行を絞り込むことができます。
3-1. 評価順序の復習が重要
SQLはWHERE句をSELECT句(集計関数がある場所)より先に評価します。
FROM:テーブル全体を選ぶWHERE:条件に合わない行を除外するSELECT:残った行だけで集計関数を実行する
3-2. 【例】2006年の売上総額だけを合計する
SELECT
SUM(TotalDue) -- 3. 残った行の TotalDue を合計する
FROM
Sales.SalesOrderHeader
WHERE
OrderDate BETWEEN '2006-01-01' AND '2006-12-31'; -- 2. 2006年の注文だけを残す
3-3. ⚠️ 数値計算と文字列
SUMやAVGのような数値計算の関数を文字列(名前や住所など) の列に使うと、SQLは「文字列を合計できない!」と判断し、エラーになります。関数を使う際は、必ず適切なデータ型の列を選びましょう。
