Dividing a Summary into Subgroups
Problem
You want to calculate a summary for each subgroup of a set of rows, not an overall summary value.
Solution
Use a GROUP
BY
clause to arrange rows into
groups.
Discussion
The summary statements shown so far calculate summary values
over all rows in the result set. For example, the following statement
determines the number of records in the mail
table, and thus the total number of
mail messages that have been sent:
mysql>SELECT COUNT(*) FROM mail;
+----------+
| COUNT(*) |
+----------+
| 16 |
+----------+
Sometimes it’s desirable to break a set of rows into subgroups
and summarize each group. Do this by using aggregate functions in
conjunction with a GROUP
BY
clause. To determine the number of
messages per sender, group the rows by sender name, count how many
times each name occurs, and display the names with the counts:
mysql>SELECT srcuser, COUNT(*) FROM mail
->GROUP BY srcuser;
+---------+----------+ | srcuser | COUNT(*) | +---------+----------+ | barb | 3 | | gene | 6 | | phil | 5 | | tricia | 2 | +---------+----------+
That query summarizes the same column that is used for grouping
(srcuser
), but that’s not always
necessary. Suppose that you want a quick characterization of the
mail
table, showing for each sender
listed in it the total amount of traffic sent (in bytes) and the
average number of bytes per message. In this case, you still use the
srcuser
column to place the rows in
groups, but the summary functions operate on the size
values:
mysql> ...
Get MySQL Cookbook, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.