| 副标题[/!--empirenews.page--] 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位);或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估)。 这个时候就要用到分组查询,分组查询的目的是为了把数据分成多个逻辑组(购买化妆品的人员是一个组,不同年龄段购买化妆品的人员也是组),并对每个组进行聚合计算的过程:。 分组查询的语法格式如下: select cname, group_fun,... from tname [where condition]group by group_expression [having group_condition];
 说明一下: 1、group_fun 代表聚合函数,是指对分组的数据进行聚合计算的函数。 2、group_expression 代表分组表达式,允许多个,多个之间使用逗号隔开。 3、group_condition 分组之后,再对分组后的数据进行条件过滤的过程。 4、分组语法中,select后面出现的字段 要么是group by后面的字段,要么是聚合函数的列,其他类型会报异常,我们下面的内容中会详细说明。 说分组之前,先来看看聚合函数,聚合函数是分组查询语法格式中重要的一部分。我们经常需要汇总数据而不用把它们实际检索出来,所以MySQL提供了专门的函数。使用这些函数,可用于计算我们需要的数据,以便分析和生成报表。 聚合函数 聚合函数有以下几种。 AVG()函数 AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均值。 AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。 下面示例返回用户表中用户的平均年龄: mysql> select * from user2;+----+--------+------+----------+-----+
 | id | name  | age | address | sex |
 +----+--------+------+----------+-----+
 | 1 | brand |  21 | fuzhou  |  1 |
 | 2 | helen |  20 | quanzhou |  0 |
 | 3 | sol  |  21 | xiamen  |  0 |
 | 4 | weng  |  33 | guizhou |  1 |
 | 5 | selina |  25 | NULL   |  0 |
 | 6 | anny  |  23 | shanghai |  0 |
 | 7 | annd  |  24 | shanghai |  1 |
 | 8 | sunny | NULL | guizhou |  0 |
 +----+--------+------+----------+-----+
 8 rows in set
 mysql> select avg(age) from user2;+----------+
 | avg(age) |
 +----------+
 | 23.8571 |
 +----------+
 1 row in set
 注意点: 1、AVG()只能用来确定特定数值列的平均值 。 2、AVG()函数忽略列值为NULL的行,所以上图中age值累加之后是除以7,而不是除以8。 COUNT()函数 COUNT()函数进行计数。 可以用COUNT()确定表中符合条件的行的数目。 count 有 count(*)、count(具体字段)、count(常量) 三种方式来体现 下面 演示了count(*) 和 count(cname)的用法。 mysql> select * from user2;+----+--------+------+----------+-----+
 | id | name  | age | address | sex |
 +----+--------+------+----------+-----+
 | 1 | brand |  21 | fuzhou  |  1 |
 | 2 | helen |  20 | quanzhou |  0 |
 | 3 | sol  |  21 | xiamen  |  0 |
 | 4 | weng  |  33 | guizhou |  1 |
 | 5 | selina |  25 | NULL   |  0 |
 | 6 | anny  |  23 | shanghai |  0 |
 | 7 | annd  |  24 | shanghai |  1 |
 | 8 | sunny | NULL | guizhou |  0 |
 +----+--------+------+----------+-----+
 8 rows in set
 mysql> select count(*) from user2 where sex=0;+----------+
 | count(*) |
 +----------+
 |    5 |
 +----------+
 1 row in set
 mysql> select count(age) from user2 where sex=0;+------------+
 | count(age) |
 +------------+
 |     4 |
 +------------+
 1 row in set
 可以看到,都是取出女生的用户数量,count(*) 比 count(age) 多一个,那是因为age中包含null值。 所以:如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是星号( *),则不忽略。 MAX()和MIN()函数 MAX()返回指定列中的最大值,MIN()返回指定列中的最小值。 mysql> select * from user2;+----+--------+------+----------+-----+
 | id | name  | age | address | sex |
 +----+--------+------+----------+-----+
 | 1 | brand |  21 | fuzhou  |  1 |
 | 2 | helen |  20 | quanzhou |  0 |
 | 3 | sol  |  21 | xiamen  |  0 |
 | 4 | weng  |  33 | guizhou |  1 |
 | 5 | selina |  25 | NULL   |  0 |
 | 6 | anny  |  23 | shanghai |  0 |
 | 7 | annd  |  24 | shanghai |  1 |
 | 8 | sunny | NULL | guizhou |  0 |
 +----+--------+------+----------+-----+
 8 rows in set
 mysql> select max(age),min(age) from user2;+----------+----------+
 | max(age) | min(age) |
 +----------+----------+
 |    33 |    20 |
 +----------+----------+
 1 row in set
 注意:同样的,MAX()、MIN()函数忽略列值为NULL的行。 SUM函数 SUM()用来返回指定列值的和(总计) ,下面返回了所有年龄的总和,同样的,忽略了null的值 mysql> select * from user2;+----+--------+------+----------+-----+
 | id | name  | age | address | sex |
 +----+--------+------+----------+-----+
 | 1 | brand |  21 | fuzhou  |  1 |
 | 2 | helen |  20 | quanzhou |  0 |
 | 3 | sol  |  21 | xiamen  |  0 |
 | 4 | weng  |  33 | guizhou |  1 |
 | 5 | selina |  25 | NULL   |  0 |
 | 6 | anny  |  23 | shanghai |  0 |
 | 7 | annd  |  24 | shanghai |  1 |
 | 8 | sunny | NULL | guizhou |  0 |
 +----+--------+------+----------+-----+
 8 rows in set
 mysql> select sum(age) from user2;+----------+
 | sum(age) |
 +----------+
 | 167   |
 +----------+
 1 row in set
 分组查询 数据准备,假设我们有一个订货单表如下(记载用户的订单金额和下单时间): (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |