返回列表 发帖

SQL必知必会(分组数据)

10.1 数据分组

从上一课得知,使用SQL的聚集函数可以汇总数据,这样,我们就能对行进行计数,计算和取平均数,不检索所有数据就能取最值。目前为止所有的计算都是在表的所有数据或者匹配特定的WHERE子句的数据上进行的。本课则说明使用分组,对每个组聚集计算。

10.2 创建分组

分组是使用SELECT语句的GROUP BY子句创建的,下例:
  1. mysql> SELECT vend_id,COUNT(*) AS num_prods
  2.     -> FROM Products
  3.     -> GROUP BY vend_id;
  4. +---------+-----------+
  5. | vend_id | num_prods |
  6. +---------+-----------+
  7. | BRS01   |         3 |
  8. | DLL01   |         4 |
  9. | FNG01   |         2 |
  10. +---------+-----------+
  11. 3 rows in set (0.03 sec)
复制代码
在使用GROUP BY之前,需要知道一些重要的规定:

GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,进而更细致分组。 如果在GROUP BY中嵌套了分组,数据将在最后指定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算。
嵌套分组,可以看下列示例:
  1. mysql> SELECT COUNT(*),prod_id,order_num FROM orderitems GROUP BY prod_id;
  2. +----------+---------+-----------+
  3. | COUNT(*) | prod_id | order_num |
  4. +----------+---------+-----------+
  5. |        3 | BNBG01  |     20007 |
  6. |        3 | BNBG02  |     20007 |
  7. |        3 | BNBG03  |     20007 |
  8. |        2 | BR01    |     20005 |
  9. |        1 | BR02    |     20006 |
  10. |        4 | BR03    |     20005 |
  11. |        2 | RGAN01  |     20007 |
  12. +----------+---------+-----------+
  13. 7 rows in set (0.00 sec)

  14. mysql> SELECT COUNT(*),prod_id,order_num FROM orderitems GROUP BY order_num,prod_id;
  15. +----------+---------+-----------+
  16. | COUNT(*) | prod_id | order_num |
  17. +----------+---------+-----------+
  18. |        1 | BR01    |     20005 |
  19. |        1 | BR03    |     20005 |
  20. |        1 | BR01    |     20006 |
  21. |        1 | BR02    |     20006 |
  22. |        1 | BR03    |     20006 |
  23. |        1 | BNBG01  |     20007 |
  24. |        1 | BNBG02  |     20007 |
  25. |        1 | BNBG03  |     20007 |
  26. |        1 | BR03    |     20007 |
  27. |        1 | RGAN01  |     20007 |
  28. |        1 | BNBG01  |     20008 |
  29. |        1 | BNBG02  |     20008 |
  30. |        1 | BNBG03  |     20008 |
  31. |        1 | BR03    |     20008 |
  32. |        1 | RGAN01  |     20008 |
  33. |        1 | BNBG01  |     20009 |
  34. |        1 | BNBG02  |     20009 |
  35. |        1 | BNBG03  |     20009 |
  36. +----------+---------+-----------+
  37. 18 rows in set (0.00 sec)
复制代码

返回列表