MySQL 集計関数: SUM、COUNT、 AVG &マックス

⚡ スマートサマリー

の集計関数 MySQL 単一の列の複数の行にわたって計算を実行し、1 つの集計値を返します。 5 つの ISO 標準関数 — COUNT、SUM、 AVG、MIN、MAXは、データベースが生成するほぼすべてのレポートの基盤となる。

  • 🔢 カウント動作: COUNT(column) は NULL 値を無視しますが、COUNT(*) は重複や NULL 値を含め、テーブル内のすべての行をカウントします。
  • 🚫 特徴的なキーワード: DISTINCTは計算実行前に重複値を削除します。ALLはデフォルト設定で、重複値を保持します。
  • 📉 最小値と最大値: MIN関数は列内の最小値を返し、MAX関数は最大値を返します。これは数値型、文字列型、日付型すべてに当てはまります。
  • SUMと AVG: どちらも数値列のみを対象とし、どちらも返される結果からNULL行を除外します。
  • 📊 ペアリングでグループ化: GROUP BY句を追加すると、単一の集計数値がグループごとに1行の集計値に変換されます。
  • ⚠️ NULLトラップ: AVG NULL以外の行数のみで除算するため、欠損値は平均値を暗黙のうちに上昇させます。

集計関数とは何ですか MySQL?

An 集計関数 単一列の複数の行を読み込み、それらを1つの値に集約します。集計関数のすべては次のとおりです。

  • 複数行に対して計算を実行する
  • テーブルの単一列の
  • そして単一の値を返します。

ISO規格では、以下の5つの集約関数が定義されています。

  1. COUNT
  2. AVG
  3. MIN
  4. MAX

5人全員に共通するルールが1つあります。 集計関数はNULL値を無視しますCOUNT(*) は唯一の例外であり、その理由については以下で説明します。

集計関数を使用する理由

組織の階層によって、必要な情報は異なります。トップレベルの管理者は通常、個々の詳細ではなく、全体の数値に関心があります。

集計関数を使用すると、データベースから要約データを簡単に生成できます。

例えば、当社のmyflixデータベースから、経営陣は以下のようなレポートを必要とする場合があります。

  • 最もレンタルされていない映画。
  • 最も多くレンタルされた映画。
  • 各映画が1ヶ月間にレンタルされる平均回数。

上記のレポートはすべて集計関数から得られたものです。それぞれを詳しく見ていきましょう。

COUNT関数

COUNT関数は、数値データ型と非数値データ型の両方において、指定されたフィールド内の値の総数を返します。 他の集計関数と同様に、COUNT(column) は NULL 値を除外します。

COUNT(*) は、テーブル内のすべての行の数を返す特別な形式です。また、 NULL また、重複もカウントされます。なぜなら、値ではなく行数をカウントするからです。

movierentalsテーブルには以下のデータが含まれています。

参照番号 取引日 戻り日 会員番号 映画ID 映画_返されました
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

IDが2の映画が何回レンタルされたかを取得したいとしましょう。

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

これを実行すると MySQL ワークベンチ myflixdb に対しては 3 が返されます。これは、3 つの行に movie_id 2 が含まれているためです。

COUNT(`movie_id`)
3

DISTINCT キーワード

COUNTは「いくつ」に答えます。次の質問は通常「いくつ」です。 今とは異なる 「それぞれ」という意味で、それがDISTINCTの目的です。

DISTINCT キーワード

DISTINCTキーワードは、グループごとに結果から重複を除外します。ping 上の図が示すとおり、全く同じ値が一緒に並んでいます。

まず、簡単なクエリを実行してみましょう。

SELECT `movie_id` FROM `movierentals`;
映画ID
1
2
2
2
3

では、同じクエリにDISTINCTキーワードを追加してみましょう。

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT は重複レコードを除外します。

映画ID
1
2
3

COUNT、COUNT(*)、COUNT(DISTINCT):どれを使うべきか?

DISTINCT も配置できます 内部 集計関数、そしてここでほとんどの初心者がつまずく。 trac実際にカウントされる行数はkです。以下の4つのフォームはすべて、先に示した5行の映画レンタルテーブルに対して実行されますが、すべて同じ数を返すわけではありません。違いは、フォームが行数をカウントするのか値数をカウントするのか、そして重複を保持するのかという2つの点に起因します。

フォーム 何が重要か 映画レンタルに関する結果
カウント(*) 重複行や完全にNULLの行を含むすべての行 5
COUNT(`movie_id`) 列内のすべてのNULL以外の値(重複を含む) 5
COUNT(`return_date`) NULL以外の値のみ - NULLの戻り日付2件はスキップされます 3
COUNT(DISTINCT `movie_id`) 一意の非NULL値のみ 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡ヒント: 行数を数えるには COUNT(*)、NULL が「該当しない」ことを意味する場合は COUNT(column)、一意の値を取得するには COUNT(DISTINCT column) を使用します。DISTINCT の反対は ALL で、これはデフォルトであるため、明示的に記述されることはほとんどありません。

MIN機能

MIN関数 指定されたテーブルフィールドの最小値を返します.

例えば、私たちのライブラリにある最も古い映画が公開された年を知りたいとします。 MySQLの MIN 関数がそれを与えてくれます。

SELECT MIN(`year_released`) FROM `movies`;

結果:

MIN(`year_released`)
2005

マックス機能

名前が示すように、MAX 関数は MIN 関数の逆です。 それ 指定されたテーブルフィールドから最大値を返します.

データベース内の最新映画の公開年を知りたいとします。以下の例はそれを返します。

SELECT MAX(`year_released`) FROM `movies`;

結果:

MAX(`year_released`)
2012

SUM機能

MIN と MAX は列から既存の値を選択します。SUM と AVG 列全体から新しい数値を計算します。

これまでに支払われた合計金額を知りたいとしましょう。 MySQL function 指定された列のすべての値の合計を返します. SUM は数値フィールドでのみ機能します, NULL値は結果から除外されます.

以下の表は、支払いテーブルのデータを示しています。

支払い_ID 会員番号 支払期日 説明 払込金額 外部参照番号
1 1 23-07-2012 映画レンタルの支払い 2500 11
2 1 25-07-2012 映画レンタルの支払い 2000 12
3 3 30-07-2012 映画レンタルの支払い 6000 NULL

以下に示すクエリは、行われたすべての支払いを取得し、それらを合計して単一の結果にします。2500 + 2000 + 6000 = 10500。

SELECT SUM(`amount_paid`) FROM `payments`;

結果:

SUM(`支払金額`)
10500

AVG function

その MySQL AVG function 指定された列の値の平均を返します。 SUM関数と同じように、 数値データ型でのみ機能します.

平均支払額を求めたいとします。その場合、合計10500をNULL以外の3つの支払行で割る以下のクエリを使用できます。

SELECT AVG(`amount_paid`) FROM `payments`;

結果:

AVG(支払金額)
3500

⚠️ 警告: AVG テーブルの行数ではなく、NULL以外の行数で割ります。NULL値はゼロとしてカウントされるのではなくスキップされるため、平均値が密かに上昇します。 AVG(IFNULL(`amount_paid`, 0)) 欠損値がゼロを意味する場合。

実例:集計関数とGROUP BYの組み合わせ

上記の各関数は、テーブル全体に対して 1 つの数値を返しました。 グループ化 この句は1つの数値を返します グループごと そうではなく、それが真のレポートの作成方法なのです。

以下の例では、メンバーを名前でグループ化し、各メンバーの支払い総数、平均支払い金額、および支払い金額の合計をカウントします。

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

上記の例を実行すると、 MySQL Workbenchは、以下の結果を表示します。

AVG GROUP BYで使用される関数

このクエリは、WHERE句で2つのテーブルを結合します(古いカンマ結合スタイル)。最新のコードでは、同じロジックを明示的に記述します。 内部結合…オンまた、SELECT リスト内の集計されていない列はすべて GROUP BY に表示する必要があることに注意してください。 MySQL 5.7以降では、ONLY_FULL_GROUP_BYの下でクエリが拒否されます。 公式 MySQL 集計関数の参照.

よくあるご質問

その WHERE句 集計を計算する前に個々の行をフィルタリングします。HAVING はその後、グループ化された結果をフィルタリングするため、COUNT(*) や SUM(amount_paid) などの集計を参照できるのは HAVING のみです。

はい。GROUP BY句がない場合、集計関数は結果セット全体を1つのグループとして扱い、正確に1行を返します。GROUP BY句を追加すると、結果は各グループ値ごとに1行に分割されます。

はい。SUMと AVGMIN関数とMAX関数は、同等のデータ型であればどれでも使用できます。テキスト列の場合はアルファベット順で最初と最後の値を返し、日付列の場合は最も早い日付と最も遅い日付を返します。

はい。テキストからSQLへの変換アシスタントは、「メンバーあたりの平均支払い額」などの質問をGROUP BYクエリに変換します。生成されたSQLを次のように実行します。 MySQL ワークベンチ 数字を信用する前に、行数を確認してください。

一般的な原因は、NULL値の処理と重複した結合行です。AIモデルは、COUNT(column)が必要な箇所でCOUNT(*)を使用したり、テーブルを2回結合したりすることがあり、その結果、すべてのSUM値が過大評価されます。必ず既知の数値と比較して確認してください。