MySQL では、GROUP BY キーワードを使用して、1 つ以上のフィールドに基づいてクエリ結果をグループ化できます。
GROUP BY キーワードを使用するための構文は次のとおりです。
GROUP BY <フィールド名>
このうち、「フィールド名」は、グループ化する必要があるフィールドの名前を示し、複数のフィールドはカンマで区切ります。
GROUP BY を単独で使用
GROUP BY キーワードを単独で使用すると、クエリ結果には各グループの最初のレコードのみが表示されます。
例 1
以下は、tb_students_info テーブルの sex フィールドに基づくグループ クエリです。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT `name`,`sex` FROM tb_students_info
-> GROUP BY sex;
+-------+------+
| name | sex |
+-------+------+
| Henry | 女 |
| Dany | 男 |
+-------+------+
2 rows in set (0.01 sec)
結果には2つのレコードのみが表示され、この2つのレコードの性別フィールドの値はそれぞれ「女性」と「男性」です。
GROUP BY と GROUP_CONCAT()
GROUP BY キーワードは、GROUP_CONCAT() 関数で使用できます。GROUP_CONCAT() 関数は、各グループのフィールド値を表示します。
例 2
次に、tb_students_info テーブルの sex フィールドに基づいてグループ クエリを実行し、GROUP_CONCAT() 関数を使用して各グループの name フィールドの値を表示します。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT `sex`, GROUP_CONCAT(name) FROM tb_students_info
-> GROUP BY sex;
+------+----------------------------+
| sex | GROUP_CONCAT(name) |
+------+----------------------------+
| 女 | Henry,Jim,John,Thomas,Tom |
| 男 | Dany,Green,Jane,Lily,Susan |
+------+----------------------------+
2 rows in set (0.00 sec)
結果からわかるように、クエリ結果は 2 つのグループに分けられ、sex フィールドの値が「female」であるグループ、値が「male」であるグループで、各グループの学生の名前が表示されていることがわかります。
例 3
以下は、tb_students_info テーブルの age フィールドと sex フィールドに基づくグループ クエリです。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT age,sex,GROUP_CONCAT(name) FROM tb_students_info
-> GROUP BY age,sex;
+------+------+--------------------+
| age | sex | GROUP_CONCAT(name) |
+------+------+--------------------+
| 21 | 女 | John |
| 22 | 女 | Thomas |
| 22 | 男 | Jane,Lily |
| 23 | 女 | Henry,Tom |
| 23 | 男 | Green,Susan |
| 24 | 女 | Jim |
| 25 | 男 | Dany |
+------+------+--------------------+
7 rows in set (0.00 sec)
上記の例では、グループ化処理では、最初に年齢フィールドがグループ化され、年齢フィールドの値が等しい場合、年齢フィールドの値が同じレコードが性別フィールドに従ってグループ化されます。
複数のフィールドをグループ化してクエリを実行すると、最初のフィールドが最初にグループ化されます。最初のフィールドに同一の値がある場合、MySQL は 2 番目のフィールドでのみグループ化します。最初のフィールドのデータが一意である場合、MySQL は 2 番目のフィールドでグループ化されなくなります。
GROUP BY と集計関数
データ統計では、GROUP BY キーワードは集計関数と一緒に使用されることがよくあります。
集計関数には、COUNT()、SUM()、AVG()、MAX()、および MIN() が含まれます。このうち、COUNT() はレコード数のカウントに使用され、SUM() はフィールド値の合計の計算に使用され、AVG() はフィールド値の平均値の計算に使用され、MAX() はクエリに使用されます。フィールドの最大値; MIN() フィールドの最小値を照会するために使用されます。
例 4
次に、tb_students_info テーブルの sex フィールドに基づいてグループ クエリを実行し、COUNT() 関数を使用して各グループのレコード数を計算します。SQL ステートメントと実行結果は次のとおりです。
mysql> SELECT sex,COUNT(sex) FROM tb_students_info
-> GROUP BY sex;
+------+------------+
| sex | COUNT(sex) |
+------+------------+
| 女 | 5 |
| 男 | 5 |
+------+------------+
2 rows in set (0.00 sec)
その結果、sex フィールドの値が「female」のレコードは 5 レコードのグループであり、sex フィールドの値が「male」のレコードは 5 レコードのグループであることがわかります。
GROUP BY と WITH ROLLUP
WITH POLLUP キーワードは、すべてのレコードの最後にレコードを追加するために使用されます.このレコードは、上記のすべてのレコードの合計、つまり統計レコードの数です.
例 5
以下は、tb_students_info テーブルの sex フィールドに基づくグループ クエリで、WITH ROLLUP を使用してレコードの合計を表示します。
mysql> SELECT sex,GROUP_CONCAT(name) FROM tb_students_info
->GROUP BY sex WITH ROLLUP;
+------+------------------------------------------------------+
| sex | GROUP_CONCAT(name) |
+------+------------------------------------------------------+
| 女 | Henry,Jim,John,Thomas,Tom |
| 男 | Dany,Green,Jane,Lily,Susan |
| NULL | Henry,Jim,John,Thomas,Tom,Dany,Green,Jane,Lily,Susan |
+------+------------------------------------------------------+
3 rows in set (0.00 sec)
クエリ結果は、GROUP_CONCAT(name) が各グループの名前フィールドの値を示していることを示しています。同時に、最後のレコードの GROUP_CONCAT(name) フィールドの値は、上記のグループ名フィールドの値の合計になります。
ダーク ホース プログラマー MySQL データベース エントリから習熟まで、mysql のインストールから高度な mysql まで、mysql の最適化をすべて網羅