group数据库名词

上传人:s9****2 文档编号:509361625 上传时间:2023-03-02 格式:DOC 页数:7 大小:83KB
返回 下载 相关 举报
group数据库名词_第1页
第1页 / 共7页
group数据库名词_第2页
第2页 / 共7页
group数据库名词_第3页
第3页 / 共7页
group数据库名词_第4页
第4页 / 共7页
group数据库名词_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《group数据库名词》由会员分享,可在线阅读,更多相关《group数据库名词(7页珍藏版)》请在金锄头文库上搜索。

1、GROUP BY 语句来源:百度百科语句简介Group By语句从英文的字面意义上理解就是根据(by) 定的规则进行分组 (Group) ”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 干个小区域进行数据处理。2. Group By 的使用:上面已经给出了对 Group By语句的理解。基于这个理解和 SQL Server 2000的联机帮 助,下面对Group By语句的各种典型使用进行依次列举说明。2.1 Group By Expressi on s:这个恐怕是 Group By语句最常见的用法了, Group By + 分组字段(可以有多个)。在 执行了这个操作

2、以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中 水果名称(FruitName)和出产 国家(ProductPlace)为联合主键:FruitNameProductPlacePriceAppleChina$1.1AppleJapan$2.1AppleUSA$2.5OrangeChina$0.8BananaChina$3.1PeachUSA$3.0如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成:SELECT COUNT(*) AS水果种类,ProductPlace AS 出产国FROM T_TEST_FRUITINFOGROUP B

3、Y ProductPlace这个SQL语句就是使用了 Group By + 分组字段的方式,那么这句SQL语句就可以解 释成我按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自 的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是ProductPlace(出产国),一个是水果种类。如果我们这里水果种类不是用Count(*),而是类似如下写法的话:SELECT FruitName, ProductPlace FROM T_TEST_FRUITINFO GROUP BY ProductPlace那么SQL在执行此语句的时候会报如下的类似错误

4、:选择列表中的列T_TEST_FRUITINFO.FruitName无效,因为该列没有包含在聚合函数或GROUP BY 子句中。这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。我们可以将Group By操作想象成如下的一个过程,首先系统根据SELECT语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。 然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,但是当前一种分组情况只有一条记录,一个

5、数据格是无法放入多个数值的, 所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregatefunctions) 了。2.2 Group By All expressi onsGroup By All + 分组字段,这个和前面提到的 Group By Expressions 的形式多了一个 关键字ALL。这个关键字只有在使用了where语句且where条件筛选掉了一些组的情况下才可以看出效果。在SQL Server 2000的联机帮助中,对于Group By All是这样进行描述的:如果使用

6、ALL关键字,那么查询结果将包括由GROUP BY子句产生的所有组,即使某些组没有符合搜索条件的行。没有ALL关键字,包含 GROUP BY子句的SELECT语句将不显示没有符合条件的行的组。其中有这么一句话如果使用ALL关键字,那么查询结果将包含由Group By子句产生的所有组没有ALL关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳 熟的,对了,好像和 LEFT JOIN 和RIGHT JOIN 有点像。其实这里是类比 LEFT JOIN 来 进行理解的。还是基于如下这样一个数据集:FruitNameProductPlacePriceAppleChina$1.1AppleJap

7、an$2.1AppleUSA$2.5OrangeChina$0.8BananaChina$3.1PeachUSA$3.0首先我们不使用带 ALL关键字的Group By语句:SELECT COUNT(*) AS水果种类,ProductPlace AS 出产国FROM T_TEST_FRUITINFOWHERE (ProductPlace Japa n)GROUP BY ProductPlace那么在最后结果中由于 Japan不符合where语句,所以分组结果中将不会出现Japan。如今我们加入ALL关键字:SELECT COUNT(*) AS水果种类,ProductPlace AS 出产国FR

8、OM T_TEST_FRUITINFOWHERE (ProductPlace Japa n)GROUP BY ALL ProductPlace重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。2.3 GROUP BY Expressio ns WITH CUBE | ROLLUP:首先需要说明的是 Group By All语句是不能和 CUBE和ROLLUP 关键字一起使用 的。首先先说说 CUBE关键字,以下是 SQL Server 2000联机帮助中的说明:在结果集内返回每个可能的组和

9、子组组合的GROUP BY汇总行。GROUP BY汇总行在结果中显示为NULL,但可用来表示所有值。使用GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。结果集内的汇总行数取决于 GROUP BY子句内包含的列数。 GROUP BY子句中的 每个操作数(列)绑定在分组 NULL下,并且分组适用于所有其它操作数 (列)。由于CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。我们通常的Group By语句是按照其后所跟的所有字段进行分组,而如果加入了 CUBE关键字以后,那么系统将根据所有字段进行分组的基础上,还会通过对所有这些分组字

10、段所有可能存在的组合形成的分组条件进行分组计算。由于上面举的例子过于简单,这里就不再适合了,如今我们的数据集将换一个场景,一个表中包含人员的基本信息:员工所在的部门编号(C_EMPLINFO_DEPTID) 、员工性另U (C_EMPLINFO_SEX) 、员工姓名 (C_EMPLINFO_NAME)等。那么我如今想知道每个部门各个性别的人数,那么我们可以通过如下语句得到:SELECT C_EMPLINFO_DEPTID,C_EMPLINFO_SEX, COUNT(*) ASC_EMPLINFO_TOTALSTAFFNUMFROM T_PERSONNEL_EMPLINFOGROUP BY C_

11、EMPLINFO_DEPTID, C_EMPLINFO_SEX实例说明:所有部门有多少人(这里相当于就不进行分组了,因为这里已经对员工的部门和性别没有做任何限制了,但是这的确也是一种分组条件的组合方式);每种性别有多人(这里实际上是仅仅根据性别 (C_EMPLINFO_SEX)进行分组);每个部门有多少人(这里仅仅是根据部门(C_EMPLINFO_DEPTID) 进行分组);那么 我们就可以使用 ROLLUP语句了。SELECT C_EMPLINFO_DEPTID,C_EMPLINFO_SEX, COUNT(*) ASC_EMPLINFO_TOTALSTAFFNUMFROM T_PERSONN

12、EL_EMPLINFOGROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH CUBE那么这里你可以看到结果集中多出了很多行,而且结果集中的某一个字段或者多个字 段、甚至全部的字段都为 NULL,请仔细看一下你就会发现实际上这些记录就是完成了上面 我所列举的所有统计数据的展现。使用过SQL Server 2005或者RDLC的朋友们一定对于矩阵的小计和分组功能有印象吧,是不是都可以通过这个得到答案。我想RDLC中对于分组和小计的计算就是通过 Group By的CUBE和ROLLUP关键字来实现的。(个人意见,未 证实)CUBE关键字还有一个极为相似的兄弟

13、 ROLLUP ,同样我们先从这英文入手,ROLL UP 是“向上卷”的意思,如果说 CUBE的组合是绝对自由的,那么 ROLLUP的组合就需要有 点约束了。我们先来看看 SQL Server 2000的联机中对 ROLLUP关键字的定义:指定在结果集内不仅包含由 GROUP BY提供的正常行,还包含汇总行。按层次结构 顺序,从组内的最低级别到最高级别汇总组。 组的层次结构取决于指定分组列时所使用的顺 序。更改分组列的顺序会影响在结果集内生成的行数。那么这个顺序是什么呢?对了就是Group By后面字段的顺序,排在靠近Group By的分组字段的级别高,然后是依次递减。如:Group By C

14、olum n1, Colum n2, Colum n3 。那么分组级别从高到低的顺序是:Colum n1 Colum n2 Colum n3。还是看我们前面的例子,SQL语句中我们仅仅将 CUBE关键字替换成 ROLLUP关键字,如:SELECT C_EMPLINFO_DEPTID,C_EMPLINFO_SEX, COUNT(*) ASC_EMPLINFO_TOTALSTAFFNUMFROM T_PERSONNEL_EMPLINFOGROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH ROLLUP和CUBE相比,返回的数据行数减少了不少。:),仔细看一

15、下,除了正常的 Group By语句后,数据中还包含了:部门员工数;(向上卷了一次,这次先去掉了员工性别的分组限制)所有部门员工数;(向上又卷了依次,这次去掉了员工所在部门的分组限制)。在现实的应用中,对于报表的一些统计功能是很有帮助的。这里还有一个问题需要补充说明一下,如果我们使用ROLLUP或者CUBE关键字,那么将产生一些小计的行,这些行中被剔除在分组因素之外的字段将会被设置为NULL,那么还存在一种情况,比如在作为分组依据的列表中存在可空的行,那么NULL也会被作为一个分组表示出来,所以这里我们就不能仅仅通过NULL来判断是不是小计记录了。下面的例子展示了这里说得到的情况。还是我们前面提到的水果例子,如今我们在每种商品后面增加一个“折扣列” (Discount),用于显示对应商品的折扣,这个数值是可空的,也就是可以 通过NULL来表示没有对应的折扣信息。数据集如下所示:FruitNameProductPlacePriceDiscou

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号