10.1 数据分组
从上一课得知,使用SQL的聚集函数可以汇总数据,这样,我们就能对行进行计数,计算和取平均数,不检索所有数据就能取最值。目前为止所有的计算都是在表的所有数据或者匹配特定的WHERE子句的数据上进行的。本课则说明使用分组,对每个组聚集计算。
10.2 创建分组
分组是使用SELECT语句的GROUP BY子句创建的,下例:- 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)
复制代码 在使用GROUP BY之前,需要知道一些重要的规定:
GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,进而更细致分组。 如果在GROUP BY中嵌套了分组,数据将在最后指定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算。
嵌套分组,可以看下列示例:- 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)
复制代码 |