收藏 分享(赏)

软件数据管理数据库.doc

上传人:weiwoduzun 文档编号:1773479 上传时间:2018-08-22 格式:DOC 页数:5 大小:24KB
下载 相关 举报
软件数据管理数据库.doc_第1页
第1页 / 共5页
软件数据管理数据库.doc_第2页
第2页 / 共5页
软件数据管理数据库.doc_第3页
第3页 / 共5页
软件数据管理数据库.doc_第4页
第4页 / 共5页
软件数据管理数据库.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、如何分类、分组以及总计 SQL 数据您需要了解如何使用某些 SQL 子句和运算符来安排 SQL 数据,从而对它进行高效分析。下面这些建议告诉您如何建立语句,获得您希望的结果。 以有意义的方式安排数据可能是一种挑战。有时您只需进行简单分类。通常您必须进行更 多处理进行分组以利于分析与总计。可喜的是,SQL 提供了大量用于分类、分组和总计的子句及运算符。下面的建议将有助于您了解何时进行分类、何时分 组、何时及如何进行总计。欲了解每个子句和运算符的详细信息,请查看在线书籍。 1、分类排序 通常,我们确实需要对所有数据进行排序。SQL 的 ORDER BY 子句将数据按字母或数字顺序进行排列。因此,同

2、类数据明显分类到各个组中。然而,这些组只是分类的结果,它们并不是真正的组。ORDER BY 显示每一个记录,而一个组可能代表多个记录。 2、减少组中的相似数据 分类与分组的最大不同在于:分类数据显示(任何限定标准内的)所有记录,而分组数据不显示这些记录。GROUP BY 子句减少一个记录中的相似数据。例如,GROUP BY 能够从重复那些值的源文件中返回一个唯一的邮政编码列表: SELECT ZIPFROM CustomersGROUP BY ZIP仅包括那些在 GROUP BY 和 SELECT 列列表中字义组的列。换句话说,SELECT 列表必须与 GROUP 列表相匹配。只有一种情况例外

3、:SELECT 列表能够包含聚合函数。(而 GROUP BY不支持聚合函数。) 记住,GROUP BY 不会对作为结果产生的组分类。要对组按字母或数字顺序排序,增加一个 ORDER BY 子句(#1)。另外,在 GROUP BY 子句中您不能引用一个有别名的域。组列必须在根本数据中,但它们不必出现在结果中。 3、分组前限定数据 您可以增加一个 WHERE 子句限定由 GROUP BY 分组的数据。例如,下面的语句仅返回肯塔基地区顾客的邮政编码列表。 SELECT ZIPFROM CustomersWHERE State = KYGROUP BY ZIP在 GROUP BY 子句求数据的值之前,

4、WHERE 对数据进行过滤,记住这一点很重要。 和 GROUP BY 一样,WHERE 不支持聚合函数。 4、返回所有组 当您用 WHERE 过滤数据时,得到的组只显示那些您指定的记录。符合组定义但不满足 子句条件的数据将不会出现在组中。不管 WHERE 条件如何,如果您想包括所有数据,增加一个 ALL 子句。例如,在前面的语句中增加一个 ALL 子句会返回所 有邮政编码组,而不仅仅是肯塔基地区的组。 SELECT ZIPFROM CustomersWHERE State = KYGROUP BY ALL ZIP照这个样子,这两个子句会造成冲突,您可能不会以这种方式使用 ALL 子句。当您用聚

5、合求一个列的值时,应用 ALL 子句很方便。例如,下面的语句计算每个肯塔基邮政编码的顾客数目,同时显示其它邮政编码值。 SELECT ZIP, Count(ZIP) AS KYCustomersByZIPFROM CustomersWHERE State = KYGROUP BY ALL ZIP得到的组由根本数据中的所有邮政编码值构成。但是,聚合列(KYCustomerByZIP)显示为 0,因为除肯塔基邮政编码组外没有别的组。 远程查询不支持 GROUP BY ALL。 5、分组后限定数据 WHERE 子句(#3)在 GROUP BY 子句之前求数据的值。当您希望在分组以后限定数据时,使用

6、HAVING。通常,不管您使用 WHERE 还是 HAVING,得到的结果相同。但要记住,这 两个子句不能互换,这点很重要。如果您存在疑问,这里有一条应用指南:过滤记录时使用WHERE;过滤组时使用 HAVING。 一般,您会用 HAVING,利用聚合来求一个组的值。例如,下面的语句返回一个邮政编码列表,但这个表内可能不包含根本数据源中的每个邮政编码: SELECT ZIP, Count(ZIP) AS CustomersByZIPFROM CustomersGROUP BY ZIPHAVING Count(ZIP) = 1仅仅那些只有一名顾客的组出现在结果中。 6、详细了解 WHERE 和

7、HAVING 如果您仍然对 WHERE 和 HAVING 的用法感到迷惑,应用下面的指导方法: WHERE 出现在 GROUP BY 之前;SQL 在它分组记录前求 WHERE 子句的值。 HAVING 出现在 GROUP BY 之后;SQL 在它分组记录后求 HAVING 子句的值。 7、用聚合总计分组值 分组数据有助于对数据进行分析,但有时您还需要组本身以外的其它信息。您可以增加一个聚合函数来总计分组数据。例如,下面的语句为每次排序显示一个小计: SELECT OrderID, Sum(Cost * Quantity) AS OrderTotalFROM OrdersGROUP BY Or

8、derID与其它的组一样,SELECT 和 GROUP BY 列表必须相匹配。在 SELECT 子句中包含一个聚合是这一规则的唯一例外。 8、总计聚合 您可以通过显示每个组的小计进一步总计数据。SQL 的 ROLLUP 运算符为每个组显示一个额外的记录,一个小计。那个记录是用聚合函数在每个组中求所有记录的值的结果。下面的语句为每个组合计 OrderTotal 列。 SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotalFROM OrdersGROUP BY Customer, OrderNumberWITH ROLLUP

9、一个包含 20 和 25 这两个 OrderTotal 值的组的 ROLLUP 行将显示 OrderTotal 值45。ROLLUP 结果的第一个值是唯一的,因为它求所有组记录的值。那个值是整个记录集的总和。 ROLLUP 不支持聚合函数中的 DISTINCT 或 GROUP BY ALL 子句。 9、总计每一列 CUBE 运算符比 ROLLUP 更进一步,它返回每个组中每个值的总数。得到的结果与ROLLUP 相似,但 CUBE 包括组中每一列的一个额外记录。下面的语句显示每个组的小计和每名顾客的一个额外总数。 SELECT Customer, OrderNumber, Sum(Cost *

10、Quantity) AS OrderTotalFROM OrdersGROUP BY Customer, OrderNumberWITH CUBE用 CUBE 得到的总计最为复杂。不仅完成聚合与 ROLLUP 的工作,而且还求定义组的其它列的值。也就是说,CUBE 总计每一个可能的列组合。 CUBE 不支持 GROUP BY ALL。 10、给总计排序 当 CUBE 的结果杂乱无章时(一般都是这样),可以增加一个 GROUPING 函数,如下所示: SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotalFROM OrdersGROUP BY Customer, OrderNumberWITH CUBE其结果包括每一行的两个额外的值。 值 1 表明左边的值是一个总计值ROLLUP 或 CUBE 的运算符的结果。 值 0 表明左边的值是一个原始 GROUP BY 子句产生的详细记录。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报