我们知道数据库通常包含大量数据,要从海量的数据中找到我们需要的某条记录无异于大海捞针,不过通过SQL语言我们可以找到很多方法从数据库中提取我们要查找的特定数据,就是通过这些方法我们才能找到“列举出七八两个月中购买了西伯利亚羊毛的所有顾客的姓名”这类问题的答案。
很多时候,我们还希望能够通过对数据进行分析,总结出规律和趋势或生成高水平的报表。例如,对于采购经理来说,他可能对所有销售出去的产品清单不感兴趣,而只是想要知道这个月产品的销售量。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
| Elizabeth
| Marks
| 48
| 3.48
| 非洲
|
753
| James
| Linea
| 9
| 7.85
| 北美洲
|
942
| Alan
| Jonas
| 638
| 3.29
| 欧洲 |
我们先从SUM函数开始。这个函数通常在SELECT语句中使用,返回系列值的总数。假设产品项目经理想了解目前为止商品的总销售额,那么我们可以使用以下的查询脚本:
SELECT SUM(数量) AS 总数 FROM ProductOrders 执行语句将返回以下结果: Total ----------- 1837 |
SELECT AVG(单价* 数量) As 平均金额 FROM ProductOrders WHERE 所在地 = “北美洲” 返回结果如下: 平均金额 --------------------- 862.3075 |
在本文第二部分,我们将探讨计算满足设定标准的记录数量的方法。
SQL提供了COUNT函数来查询满足设定标准的记录的数量。我们可以使用单独COUNT(*)语法来检索一个表内的行数。此外,还可以利用WHERE子句来设置计数条件,返回特定记录的条数。例如,假设我们的产品销售经理想了解公司处理了多少张要求购买100个以上产品的订单。下面是满足这个条件的SQL查询脚本:
SELECT COUNT(*) AS '大订单数量' FROM ProductOrders WHERE 数量> 100 返回结果如下: 大订单数量 ---------------------- 3 |
COUNT函数还允许使用 DISTINCT关键字和表达式来计算满足表达式的值在目标数据中出现的数量。同样地,还可以使用ALL关键字来返回满足表达式的值的全部数量,不管其中有没有重复值。例如,产品经理想通过一个简单查询返回数据库中“所在地”的数量。
首先我们来看看使用ALL关键字的查询:
SELECT COUNT(ALL 所在地 ) As ' 所在地数量 ' FROM ProductOrders
返回的结果为:
所在地数量
|
SELECT COUNT(DISTINCT 所在地) As '所在地数量' FROM ProductOrders 返回的结果为: 所在地数量 -------------------- 3 |
这才是我们想要的结果。
在本文的第三部分,我们将介绍如何利用函数来查找目标集中的最大值和最小值。
第三部分:最大值和最小值
在本文的最后一节,我们来看看SQL为我们提供用来查找满足给定表达式的最大值和最小值的函数。MAX()函数返回给定数据集中的最大值。我们可以给该函数一个字段名称来返回表中给定字段的最大值。还可以在MAX()函数中使用表达式和GROUP BY从句来加强查找功能。
还是ProductOrders表,假设我们的产品经理想要从这个数据库中找到给公司带来最多收入的那份订单。我们可以使用以下查询来找到这张订单,并返回该订单的销售总金额:
SELECT MAX(数量 * 单价)As '最大的订单' FROM ProductOrders 返回结果如下: 最大的订单 --------------------- 2517.58 |
MIN()函数的用法类似,但返回表达式的最小值。让我们用MIN()函数来尝试稍微复杂一点的查询。我们的销售部门目前正在分析小订单的数据。他们想要查询每个所在地的最小订单。这除了要在表达式中计算值外,还需要用到GROUP BY从句来总结所在地的数据。SQL查询如下:
SELECT
所在地
, MIN(
数量
*
单价
) AS '
最小订单
'
FROM ProductOrders GROUP BY 所在地
返回结果如下:
所在地
最小订单
------------- --------------------- 非洲 167.04 欧洲 2099.02 北美洲 70.65
|