副问题[/!--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
分组查询
数据筹备,假设我们有一个订货单表如下(记适用户的订单金额和下单时刻):
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|