MySQL高级特性之集合函数

到现在为止,你只学习了如何根据特定的条件从表中取出一条或多条记录。但是,假如你想对一个表中的记录进行数据统计。例如,如果你想统计存储在表中的一次民意测验的投票结果。或者你想知道一个访问者在你的站点上平均花费了多少时间。要对表中的任何类型的数据进行统计,都需要使用集合函数。你可以统计记录数目,平均值,最小值,最大值,或者求和。当你使用一个集合函数时,它只返回一个数,该数值代表这几个统计值之一。

  这些函数的最大特点就是经常和GROUP BY语句配合使用,需要注意的是集合函数不能和非分组的列混合使用。

  行列计数

  计算查询语句返回的记录行数

  直接计算函数COUNT(*)的值,例如,计算pet表中猫的只数:

  mysql>SELECT count(*) FROM pet WHERE species=’cat’;

  +----------+

  | count(*) |

  +----------+

  | 2 |

  +----------+

  统计字段值的数目

  例如,计算pet表中species列的数目:

  mysql> SELECT count(species) FROM pet;

  +----------------+

  | count(species) |

  +----------------+

  | 9 |

  +----------------+

  如果相同的种类出现了不止一次,该种类将会被计算多次。如果你想知道种类为某个特定值的宠物有多少个,你可以使用WHERE子句,如下例所示:

  mysql> SELECT COUNT(species) FROM pet WHERE species='cat' ;

  注意这条语句的结果:

  +----------------+

  | COUNT(species) |

  +----------------+

  | 2 |

  +----------------+

  这个例子返回种类为'cat'的作者的数目。如果这个名字在表pet中出现了两次,则次函数的返回值是2。 而且它和上面提到过的语句的结果是一致的:

  SELECT count(*) FROM pet WHERE species=’cat’

  实际上,这两条语句是等价的。

  假如你想知道有多少不同种类的的宠物数目。你可以通过使用关键字DISTINCT来得到该数目。如下例所示:

  mysql> SELECT COUNT(DISTINCT species) FROM pet;

  +-------------------------+

  | COUNT(DISTINCT species) |

  +-------------------------+

  | 5 |

  +-------------------------+

  如果种类'cat'出现了不止一次,它将只被计算一次。关键字DISTINCT 决定了只有互不相同的值才被计算。

  通常,当你使用COUNT()时,字段中的空值将被忽略。

  另外,COUNT()函数通常和GROUP BY子句配合使用,例如可以这样返回每种宠物的数目:

  mysql> SELECT species,count(*) FROM pet GROUP BY species;

  +---------+----------+

  | species | count(*) |

  +---------+----------+

  | bird | 2 |

  | cat | 2 |

  | dog | 3 |

  | hamster | 1 |

  | snake | 1 |

  +---------+----------+

  计算字段的平均值

  需要计算这些值的平均值。使用函数AVG(),你可以返回一个字段中所有值的平均值。

  假如你对你的站点进行一次较为复杂的民意调查。访问者可以在1到10之间投票,表示他们喜欢你站点的程度。你把投票结果保存在名为vote的INT型字段中。要计算你的用户投票的平均值,你需要使用函数AVG():

  SELECT AVG(vote) FROM opinion

  这个SELECT语句的返回值代表用户对你站点的平均喜欢程度。函数AVG()只能对数值型字段使用。这个函数在计算平均值时也忽略空值。

  再给出一个实际例子,例如我们要计算pet表中每种动物年龄的平均值,那么使用AVG()函数和GROUP BY子句:

  mysql> SELECT species,AVG(CURDATE()-birth) FROM pet GROUP BY species;

  返回的结果为:

  +---------+----------------------+

  | species | AVG(CURDATE()-birth) |

  +---------+----------------------+

  | bird | 34160 |

  | cat | 74959.5 |

  | dog | 112829.66666667 |

  | hamster | 19890 |

  | snake | 49791 |

  +---------+----------------------+

  计算字段值的和

  假设你的站点被用来出售某种商品,已经运行了两个月,是该计算赚了多少钱的时候了。假设有一个名为orders的表用来记录所有访问者的定购信息。要计算所有定购量的总和,你可以使用函数SUM():

  SELECT SUM(purchase_amount) FROM orders

  函数SUM()的返回值代表字段purchase_amount中所有值的总和。字段purchase_amount的数据类型也许是DECIMAL类型,但你也可以对其它数值型字段使用函数SUM()。

  用一个不太恰当的例子说明,我们计算pet表中同种宠物的年龄的总和:

  mysql> SELECT species,SUM(CURDATE()-birth) FROM pet GROUP BY species;

  你可以查看结果,与前一个例子对照:

  +---------+----------------------+

  | species | SUM(CURDATE()-birth) |

  +---------+----------------------+

  | bird | 68320 |

  | cat | 149919 |

  | dog | 338489 |

  | hamster | 19890 |

  | snake | 49791 |

  +---------+----------------------+

  计算字段值的极值

  求字段的极值,涉及两个函数MAX()和MIN()。

  例如,还是pet表,你想知道最早的动物出生日期,由于日期最早就是最小,所以可以使用MIN()函数:

  mysql> SELECT MIN(birth) FROM pet;

  +------------+

  | MIN(birth) |

  +------------+

  | 1989-05-13 |

  +------------+

  但是,你只知道了日期,还是无法知道是哪只宠物,你可能想到这样做:

  SELECT name,MIN(birth) FROM pet;

  但是,这是一个错误的SQL语句,因为集合函数不能和非分组的列混合使用,这里name列是没有分组的。所以,你无法同时得到name列的值和birth的极值。

  MIN()函数同样可以与GROUP BY子句配合使用,例如,找出每种宠物中最早的出生日期:

  mysql> SELECT species,MIN(birth) FROM pet GROUP BY species;

  下面是令人满意的结果:

  +---------+------------+

  | species | MIN(birth) |

  +---------+------------+

  | bird | 1997-12-09 |

  | cat | 1993-02-04 |

  | dog | 1989-05-13 |

  | hamster | 1999-03-30 |

  | snake | 1996-04-29 |

  +---------+------------+

  另一方面,如果你想知道最近的出生日期,就是日期的最大值,你可以使用MAX()函数,如下例所示:

  mysql> SELECT species,MAX(birth) FROM pet GROUP BY species;

  +---------+------------+

  | species | MAX(birth) |

  +---------+------------+

  | bird | 1998-09-11 |

  | cat | 1994-03-17 |

  | dog | 1990-08-31 |

  | hamster | 1999-03-30 |

  | snake | 1996-04-29 |

  +---------+------------+

  总结

  在本节中,介绍了一些典型的集合函数的用法,包括计数、均值、极值和总和,这些都是SQL语言中非常常用的函数。

  这些函数之所以称之为集合函数,是因为它们应用在多条记录中,所以集合函数最常见的用法就是与GROUP BY子句配合使用,最重要的是集合函数不能同未分组的列混合使用。

.pb{} .pb textarea{font-size:14px; margin:10px; font-family:"宋体"; background:#FFFFEE; color:#000066} .pb_t{line-height:30px; font-size:14px; color:#000; text-align:center;} /* 分页 */ .pagebox{overflow:hidden; zoom:1; font-size:12px; font-family:"宋体",sans-serif;} .pagebox span{float:left; margin-right:2px; overflow:hidden; text-align:center; background:#fff;} .pagebox span a{display:block; overflow:hidden; zoom:1; _float:left;} .pagebox span.pagebox_pre_nolink{border:1px #ddd solid; width:53px; height:21px; line-height:21px; text-align:center; color:#999; cursor:default;} .pagebox span.pagebox_pre{color:#3568b9; height:23px;} .pagebox span.pagebox_pre a,.pagebox span.pagebox_pre a:visited,.pagebox span.pagebox_next a,.pagebox span.pagebox_next a:visited{border:1px #9aafe5 solid; color:#3568b9; text-decoration:none; text-align:center; width:53px; cursor:pointer; height:21px; line-height:21px;} .pagebox span.pagebox_pre a:hover,.pagebox span.pagebox_pre a:active,.pagebox span.pagebox_next a:hover,.pagebox span.pagebox_next a:active{color:#363636; border:1px #2e6ab1 solid;} .pagebox span.pagebox_num_nonce{padding:0 8px; height:23px; line-height:23px; color:#fff; cursor:default; background:#296cb3; font-weight:bold;} .pagebox span.pagebox_num{color:#3568b9; height:23px;} .pagebox span.pagebox_num a,.pagebox span.pagebox_num a:visited{border:1px #9aafe5 solid; color:#3568b9; text-decoration:none; padding:0 8px; cursor:pointer; height:21px; line-height:21px;} .pagebox span.pagebox_num a:hover,.pagebox span.pagebox_num a:active{border:1px #2e6ab1 solid;color:#363636;} .pagebox span.pagebox_num_ellipsis{color:#393733; width:22px; background:none; line-height:23px;} .pagebox span.pagebox_next_nolink{border:1px #ddd solid; width:53px; height:21px; line-height:21px; text-align:center; color:#999; cursor:default;}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14884316/viewspace-530124/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14884316/viewspace-530124/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值