非淡泊无以明志,非宁静无以致远
全部博文(408)
分类: 数据库开发技术
2010-09-14 09:32:04
很多时候,我们还希望能够通过对数据进行分析,总结出规律和趋势或生成高水平的报表。例如,对于采购经理来说,他可能对所有销售出去的产品清单不感兴趣,而只是想要知道这个月产品的销售量。SQL提供了聚合函数(aggregate functions)功能来支持对大量数据进行总结的操作。
本文我们将具体来看看这些函数的功能和用法,包括添加数据和计算平均值的函数、对符合特定标准的记录进行计数的函数,以及找出表中最大值和最小值的函数。
我们将使用下文所示的ProductOrder表来执行我们所有的查询。注意,这个表并没有标准化,而是将几个数据实体联合到一个表中,这样做是为了简化条件方便说明。如果要设计较好的关系数据库,应当把这些内容至少分成三个关联表Products、Orders和Customers。
订单号 |
客户名 |
客户姓 |
数量 |
单价 |
所在地 |
122 |
John |
Jacob |
21 |
4.52 |
北美洲 |
923 |
Ralph |
Wiggum |
192 |
3.99 |
北美洲 |
238 |
Ryan |
Johnson |
87 |
4.49 |
非洲 |
829 |
Mary |
Smith |
842 |
2.99 |
北美洲 |
824 |
|
Marks |
48 |
3.48 |
非洲 |
753 |
James |
Linea |
9 |
7.85 |
北美洲 |
942 |
Alan |
Jonas |
638 |
3.29 |
欧洲 |
1.SUM函数:
我们先从SUM函数开始。这个函数通常在SELECT语句中使用,返回系列值的总数。假设产品项目经理想了解目前为止商品的总销售额,那么我们可以使用以下的查询脚本:
SELECT SUM(数量) AS 总数 |
2. AVG函数(平均函数)
使用方法和SUM类似,它给我们提供系列值的算术平均数。这次我们可以尝试稍微复杂点的任务:找出北美洲大陆所有订单的金额平均值。注意,我们需要将“数量”列和“单价”列相乘计算出每张订单的金额总数。查询脚本如下:
SELECT AVG(单价* 数量) As 平均金额 |
3. COUNT计数函数
SQL提供了COUNT函数来查询满足设定标准的记录的数量。我们可以使用单独COUNT(*)语法来检索一个表内的行数。此外,还可以利用WHERE子句来设置计数条件,返回特定记录的条数。例如,假设我们的产品销售经理想了解公司处理了多少张要求购买100个以上产品的订单。下面是满足这个条件的SQL查询脚本:
SELECT COUNT(*) AS '大订单数量' |
COUNT函数还允许使用 DISTINCT关键字和表达式来计算满足表达式的值在目标数据中出现的数量。同样地,还可以使用ALL关键字来返回满足表达式的值的全部数量,不管其中有没有重复值。例如,产品经理想通过一个简单查询返回数据库中“所在地”的数量。
首先我们来看看使用ALL关键字的查询:
SELECT COUNT(ALL 所在地) As '所在地数量' 返回的结果为: 所在地数量 |
显然这不是我们需要的结果。因为根据ProductOrders表所示,所有订单的所在地只有三个,分别是北美洲、非洲、欧洲。下面让我们来用DISTINCT关键字来代替看看:
SELECT COUNT(DISTINCT 所在地) As '所在地数量' |
这才是我们想要的结果。
4. 最大值和最小值
在本文的最后一节,我们来看看SQL为我们提供用来查找满足给定表达式的最大值和最小值的函数。MAX()函数返回给定数据集中的最大值。我们可以给该函数一个字段名称来返回表中给定字段的最大值。还可以在MAX()函数中使用表达式和GROUP BY从句来加强查找功能。
还是ProductOrders表,假设我们的产品经理想要从这个数据库中找到给公司带来最多收入的那份订单。我们可以使用以下查询来找到这张订单,并返回该订单的销售总金额:
SELECT MAX(数量 * 单价)As '最大的订单' |
MIN()函数的用法类似,但返回表达式的最小值。让我们用MIN()函数来尝试稍微复杂一点的查询。我们的销售部门目前正在分析小订单的数据。他们想要查询每个所在地的最小订单。这除了要在表达式中计算值外,还需要用到GROUP BY从句来总结所在地的数据。SQL查询如下:
SELECT 所在地, MIN(数量 * 单价) AS '最小订单' 返回结果如下: 所在地 最小订单 |