MySQLでHAVING句とAVG()を使って重複する要素ごとの平均値を求め、並べ替える方法
MySQLでグループ化したデータの平均値を条件付きで取得するには
GROUP BYでグループ化した結果に対して集計関数(AVGなど)の条件を指定する場合は、WHERE句ではなくHAVING句を使用します。WHERE句はグループ化の前に行単位でフィルタリングするため、AVG()のような集計関数を直接使うことができません。一方、HAVING句はGROUP BYによるグループ化の後に適用されるため、集計結果に対して条件を設定できます。
ここでは、重複して登録された名前ごとのスコア平均を求め、その平均値が9.5未満のレコードを昇順に並べて表示する例を紹介します。
1. サンプルテーブルの作成
まず、テーブルを作成します。
mysql> create table DemoTable1338
-> (
-> Name varchar(10),
-> Score int
-> );
Query OK, 0 rows affected (1.54 sec)2. 重複する名前を持つデータを挿入
INSERTコマンドを使ってレコードを登録します。意図的に同じ名前を異なるスコアで複数件挿入しています。
mysql> insert into DemoTable1338 values('Chris',8);
Query OK, 1 row affected (0.80 sec)
mysql> insert into DemoTable1338 values('Bob',4);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1338 values('Bob',9);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1338 values('Chris',6);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1338 values('David',5);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1338 values('David',7);
Query OK, 1 row affected (0.40 sec)3. 登録したレコードを確認する
SELECT文ですべてのレコードを表示します。
mysql> select * from DemoTable1338;
実行結果は以下の通りです。
+-------+-------+ | Name | Score | +-------+-------+ | Chris | 8 | | Bob | 4 | | Bob | 9 | | Chris | 6 | | David | 5 | | David | 7 | +-------+-------+ 6 rows in set (0.00 sec)
4. 重複する個々の要素の平均を求めて並べ替えるクエリ
次のクエリでは、Nameでグループ化してAVG(Score)で平均を計算し、HAVING句で「平均が9.5未満」という条件を絞り込み、最後にORDER BYで平均値の昇順に並べ替えています。
mysql> select Name,avg(Score) from DemoTable1338
-> group by Name
-> having avg(Score) < 9.5
-> order by avg(Score);実行すると、以下の出力が得られます。
+-------+------------+ | Name | avg(Score) | +-------+------------+ | David | 6.0000 | | Bob | 6.5000 | | Chris | 7.0000 | +-------+------------+ 3 rows in set (0.00 sec)
ポイントまとめ
- 集計関数の結果に条件を付けたい場合はWHEREではなくHAVING句を使う。
- GROUP BYでグループ化することで、重複している名前ごとに平均値を算出できる。
- ORDER BY avg(Score) を組み合わせれば、平均値の小さい順に結果を並べ替えられる。
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入
-
MySQLで重複する列の値を検索して表示する方法(GROUP BY HAVING句の使い方)
MySQLでテーブル内の重複データを検索したい場面は多くあります。例えば、登録データの重複チェックやデータクレンジングなどが挙げられます。このような場合には、GROUP BY句とHAVING句を組み合わせることで、簡単に重複する列の値を抽出できます。 重複検出の基本的な考え方 GROUP BY句で列の値ごとにレコードをグループ化し、HAVING句で「同じ値が2件以上存在するグループ」だけを絞り込むことで、重複している値だけを取り出すことができます。 サンプルテーブルの作成 まず、検証用のテーブルを作成します。 mysql> create table DemoTable1858