SQL必知必会(分组数据)
10.1 数据分组从上一课得知,使用SQL的聚集函数可以汇总数据,这样,我们就能对行进行计数,计算和取平均数,不检索所有数据就能取最值。目前为止所有的计算都是在表的所有数据或者匹配特定的WHERE子句的数据上进行的。本课则说明使用分组,对每个组聚集计算。
10.2 创建分组
分组是使用SELECT语句的GROUP BY子句创建的,下例:[code]mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM Products
-> GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| BRS01 | 3 |
| DLL01 | 4 |
| FNG01 | 2 |
+---------+-----------+
3 rows in set (0.03 sec)[/code]在使用GROUP BY之前,需要知道一些重要的规定:
GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,进而更细致分组。 如果在GROUP BY中嵌套了分组,数据将在最后指定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算。
嵌套分组,可以看下列示例:[code]mysql> SELECT COUNT(*),prod_id,order_num FROM orderitems GROUP BY prod_id;
+----------+---------+-----------+
| COUNT(*) | prod_id | order_num |
+----------+---------+-----------+
| 3 | BNBG01 | 20007 |
| 3 | BNBG02 | 20007 |
| 3 | BNBG03 | 20007 |
| 2 | BR01 | 20005 |
| 1 | BR02 | 20006 |
| 4 | BR03 | 20005 |
| 2 | RGAN01 | 20007 |
+----------+---------+-----------+
7 rows in set (0.00 sec)
mysql> SELECT COUNT(*),prod_id,order_num FROM orderitems GROUP BY order_num,prod_id;
+----------+---------+-----------+
| COUNT(*) | prod_id | order_num |
+----------+---------+-----------+
| 1 | BR01 | 20005 |
| 1 | BR03 | 20005 |
| 1 | BR01 | 20006 |
| 1 | BR02 | 20006 |
| 1 | BR03 | 20006 |
| 1 | BNBG01 | 20007 |
| 1 | BNBG02 | 20007 |
| 1 | BNBG03 | 20007 |
| 1 | BR03 | 20007 |
| 1 | RGAN01 | 20007 |
| 1 | BNBG01 | 20008 |
| 1 | BNBG02 | 20008 |
| 1 | BNBG03 | 20008 |
| 1 | BR03 | 20008 |
| 1 | RGAN01 | 20008 |
| 1 | BNBG01 | 20009 |
| 1 | BNBG02 | 20009 |
| 1 | BNBG03 | 20009 |
+----------+---------+-----------+
18 rows in set (0.00 sec)
[/code]
页:
[1]