MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。

この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。

サンプルテーブルの作成

まず、以下のクエリでテーブルを作成します。

mysql> create table DemoTable1934
    (
    StudentName varchar(20),
    StudentMarks int
    );
Query OK, 0 rows affected (0.00 sec)

テストデータの挿入

次に、INSERT コマンドを使っていくつかのレコードを挿入します。ここでは意図的に同じデータを重複して登録しています。

mysql> insert into DemoTable1934 values('Chris',56);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('Chris',56);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('David',78);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('David',78);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('Carol',45);
Query OK, 1 row affected (0.00 sec)

登録されたレコードの確認

SELECT 文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1934;

実行結果は以下の通りです。

+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| Chris       |           56 |
| Chris       |           56 |
| David       |           78 |
| David       |           78 |
| Carol       |           45 |
+-------------+--------------+
5 rows in set (0.00 sec)

このように、Chris と David のデータがそれぞれ2件ずつ重複して登録されていることがわかります。

重複を除外して平均値を取得するクエリ

テーブルの個別(DISTINCT)なレコードから平均値を選択するには、サブクエリ内で SELECT DISTINCT を使い、その結果に対して AVG() 関数を適用します。

mysql> select avg(tbl.StudentMarks)
    from
    (
    select distinct StudentName,StudentMarks
    from DemoTable1934
    ) as tbl;

実行結果は以下の通りです。

+-----------------------+
| avg(tbl.StudentMarks) |
+-----------------------+
|               59.6667 |
+-----------------------+
1 row in set (0.00 sec)

結果の解説

重複を除外すると、残るレコードは「Chris:56」「David:78」「Carol:45」の3件になります。これらの平均は (56 + 78 + 45) ÷ 3 = 59.6667 となります。

もし DISTINCT を使わずに単純に AVG(StudentMarks) を実行した場合、重複データも含めた5件の平均(62.6)が計算されてしまうため、目的に応じて使い分けることが重要です。

  1. MySQLで当日の00:00から現在時刻までのレコードを抽出するクエリの書き方

    はじめにMySQLで「今日の日付の午前0時(00:00)から現在時刻まで」のレコードを取得したいケースはよくあります。例えば、現在の日時が 2019-09-14 08:50:10 である場合、2019-09-14 00:00:00 から 2019-09-14 08:50:10 までの範囲にあるレコードを抽出することになります。本記事では、実際にテーブルを作成し、データを挿入しながら、この条件を実現するクエリを具体的に解説します。サンプルテーブルの作成まず、DATETIME型のカラムを持つテーブルを作成します。mysql> create table DemoTable( &nbs

  2. MySQLのSELECT文で特定のカラム(列)のレコードを取得する方法

    はじめにMySQLでSELECTクエリを実行する際、SELECT *を使うとすべてのカラムが取得されますが、カラム名を明示的に指定すれば、必要なカラム(列)のデータだけを効率的に取り出せます。この記事では、サンプルテーブルを作成しながら、特定のカラムのレコードを取得する手順を解説します。1. テーブルの作成まず、CREATE TABLE文でサンプル用のテーブルを作成しましょう。mysql> create table DemoTable1837    (    StudentId int NOT NULL AU