MySQLでGROUP BYとORDER BYを使って同名の学生のスコアを合計・並べ替える方法
はじめに
MySQLで同じ名前の学生ごとにスコアを合計し、その結果を並べ替えて表示したい場合は、GROUP BY句とORDER BY句を組み合わせて使用します。GROUP BYで学生名ごとにレコードをグループ化し、SUM()関数でスコアを合計、最後にORDER BYで結果を昇順または降順にソートします。
この記事では、実際にテーブルを作成しながら、具体的な手順を解説します。
サンプルテーブルの作成
まず、学生名と数学のスコアを格納するテーブルを作成しましょう。以下のCREATE TABLE文を実行します。
mysql> create table countRowValueDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentMathScore int
-> );
Query OK, 0 rows affected (0.71 sec)
このテーブルは、学生ID(自動採番の主キー)、学生名、数学のスコアの3つのカラムで構成されています。
テストデータの挿入
次に、INSERTコマンドを使ってレコードを挿入します。ここでは、意図的に「David」と「John」のデータを複数件登録しています。
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('Larry',45);
Query OK, 1 row affected (0.19 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('Mike',56);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('John',60);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('David',40);
Query OK, 1 row affected (0.24 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('David',70);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('John',80);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countRowValueDemo(StudentName,StudentMathScore) values('David',88);
Query OK, 1 row affected (0.17 sec)登録済みデータの確認
SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認します。
mysql> select * from countRowValueDemo;
実行結果は以下のとおりです。
+-----------+-------------+------------------+
| StudentId | StudentName | StudentMathScore |
+-----------+-------------+------------------+
| 1 | Larry | 45 |
| 2 | Mike | 56 |
| 3 | John | 60 |
| 4 | David | 40 |
| 5 | David | 70 |
| 6 | John | 80 |
| 7 | David | 88 |
+-----------+-------------+------------------+
7 rows in set (0.00 sec)
「David」は3件(40点・70点・88点)、「John」は2件(60点・80点)登録されており、これらをグループ化して合計できることがわかります。
ケース1:合計スコアを降順で表示する
同名の学生のスコアを合計し、結果を降順(高い順)で表示するクエリが以下です。ORDER BY句にDESCを指定することで、合計スコアの高い学生から順に並びます。
mysql> select StudentName,
-> sum(StudentMathScore) AS TOTAL_SCORE
-> from countRowValueDemo
-> group by StudentName
-> order by sum(StudentMathScore) desc;
実行結果:
+-------------+-------------+
| StudentName | TOTAL_SCORE |
+-------------+-------------+
| David | 198 |
| John | 140 |
| Mike | 56 |
| Larry | 45 |
+-------------+-------------+
4 rows in set (0.00 sec)
Davidのスコア(40+70+88=198点)、Johnのスコア(60+80=140点)がそれぞれ正しく合計され、降順に表示されていることが確認できます。
ケース2:合計スコアを昇順で表示する
逆に、合計スコアの低い順(昇順)で表示したい場合は、ORDER BY句からDESCを外すだけです。MySQLではORDER BYのデフォルトが昇順(ASC)のため、明示的にASCと書かなくても動作します。
mysql> select StudentName,
-> sum(StudentMathScore) AS TOTAL_SCORE
-> from countRowValueDemo
-> group by StudentName
-> order by sum(StudentMathScore);
実行結果:
+-------------+-------------+
| StudentName | TOTAL_SCORE |
+-------------+-------------+
| Larry | 45 |
| Mike | 56 |
| John | 140 |
| David | 198 |
+-------------+-------------+
4 rows in set (0.00 sec)
まとめ
同名の学生のスコアを合計して並べ替えるには、以下のポイントを押さえておきましょう。
- GROUP BY:学生名ごとにレコードをグループ化する
- SUM():各グループのスコアを合計する
- ORDER BY ~ DESC:合計値を降順(高い順)にソートする
- ORDER BY ~(省略またはASC):合計値を昇順(低い順)にソートする
なお、可読性を高めるためにSUM()の結果にAS句で別名(TOTAL_SCORE)を付けていますが、ORDER BYでは別名ではなくsum(StudentMathScore)を直接指定しています。多くの環境では別名での指定も可能ですが、SQL標準やバージョンによって挙動が異なる場合があるため、集計関数を直接指定する方法が確実です。
-
MySQLで複数のLIKE演算子をORDER BYと組み合わせる方法
MySQLでは、複数のLIKE演算子をORDER BY句の中で組み合わせることで、指定したキーワードにより多く一致するレコードを優先的に並べ替えることができます。このテクニックは、LIKE演算子が「一致すれば1」「一致しなければ0」を返すという性質を利用しています。各条件の結果を足し合わせることで一致数を計算し、降順(DESC)にソートすることで、関連度の高いレコードを上位に表示できるのです。以下は、複数のLIKE演算子をORDER BYと組み合わせて実装する際の基本構文です。select *from yourTableName order by ( yourColumnName li
-
MySQLで同じIDの行を合計する方法:GROUP BYとHAVING句の使い方
MySQLで同じIDを持つ複数の行の値を合計したい場合、「GROUP BY」句と「HAVING」句を組み合わせて使用します。この記事では、テーブルの作成からクエリの実行まで、手順を追ってわかりやすく解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。ここでは「id」と「price」という2つのカラムを持つシンプルなテーブルを用意します。 例 mysql> create table demo84 -> ( -> id int, -> price int -> ) -> ; Query OK,