Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

全面掌握MS ACCESS SQL(23)

时 间:2018-01-12 10:42:16
作 者:Big Young   ID:252  城市:襄阳
摘 要:    用GROUP BY子句对返回记录进行分组。
正 文:

            第五节 用GROUP BY子句对返回记录进行分组

Access中的GROUP BY子句将指定的字段列表中具有相同值的记录组合成一个记录。如果在Select语句中包括SQL聚合函数(例如SumCount),则会为每个记录创建汇总值。

一、带GROUP BY子句的Select语句的基本语法

    语法:

    Select fieldlist

FROM table

Where criteria

[GROUP BY groupfieldlist]

 

包含GROUP BY子句的Select语句由以下部分组成:

部分

说明

Fieldlist

要与任何字段名别名、SQL 聚合函数、选择谓词(ALLDISTINCTDISTINCTROWTOP)或其他Select语句选项一起进行检索的字段的名称。

Table

从中检索记录的表的名称。

Criteria

选择条件。如果语句包含Where子句,则在将Where条件应用于记录之后,Microsoft Access数据库引擎对值进行分组。

Groupfieldlist

用来对记录进行分组的最多10个字段的名称。groupfieldlist中字段名称的顺序确定了从最高到最低的分组级别。

几点说明:

1GROUP BY是可选的。

2、如果Select语句中没有SQL聚合函数,则省略汇总值。

3GROUP BY字段中的Null值将被分组,而不会省略。但是,在任何SQL聚合函数中都不会计算Null值。

    4、使用Where子句可以排除不想分组的行,使用HAVING子句则可以在分组记录之后筛选这些记录。

    5、除非GROUP BY字段列表中的字段包含MemoOLE Object数据,否则,假如Select语句包含至少一个SQL聚合函数,则GROUP BY字段列表中的字段就可以引用FROM子句所列出的任何表中的任何字段,无论Select语句是否包含该字段。Microsoft Access数据库引擎无法对“Memo”“OLE Object”字段进行分组。

    6Select字段列表中的所有字段都必须包括在GROUP BY子句中,或作为SQL聚合函数的参数包括在内。

二、SQLGROUP BY的使用

GROUP BY”从字面意义上理解就是根据“BY”指定的规则对数据进行分组,所谓的分组就是将一个数据集划分成若干个小区域,然后针对若干个小区域进行数据处理。ACCESS里“GROUP BY”子句通常要与聚合函数配合使用借以提取记录中的分组信息,最常用的SQL聚合函数包括AvgCountMaxMinSum等。

例如有一个名为学生的数据库表,内容如下:

"ID","班级","姓名","性别","评分"

1,"一班","张三","",6

2,"一班","李四","",8

3,"二班","王五","",5

4,"一班","陈一","",8

5,"二班","赵七","",9

1)求各班的人数、总评分和平均评分

运行SQL查询:

Select 班级, count(*) AS 人数, sum(评分) AS 总评分, Avg(评分) AS 平均分 

FROM 学生

GROUP BY 班级;

返回结果如下:

班级  人数  总评分 平均分

一班   3      22         7.33

二班   2      14         7

2)求各班的男女生人数

运行SQL查询

Select 班级, 性别, count(*) AS 人数

FROM 学生

GROUP BY 班级, 性别;

返回结果:

班级  性别, 人数

一班          2

一班          1

二班          1

二班          1

注意:使用GROUP BY子句时,输出的字段列表里(Select子句),除了分组字段和汇总信息外,不得含有其它没参与分组的字段,否则系统会报错。

三、使用HAVING子句对分组后的数据进行筛选

ACCESS SQLHAVING子句可以让我们筛选分组后的各组数据,即HAVING子句的作用是对分组准则做进一步规定,也就是可以对参与分组的字段和分组汇总信息做进一步的限定和筛选。它必须与GROUP BY子句配合使用,而不能像Where子句那样可单独使用,这是第一点;第二点HAVING子句里只能对出现在GROUP BY子句里的分组字段指定连接条件、限定或筛选,字段被用聚合函数(如sumcountavgminmaxfirstlast等)计算获取的分组汇总信息则不受限制,可随意对这些汇总信息做所需的限定;第三点与Where子句不一样,HAVING子句里无法识别字段别名,被限定的字段须使用原表字段名,而不得使用Select子句里所起的字段别名,输出字段如为计算表达式的如需对其值范围做HAVING限制,则必须以该表达式出现在HAVING子句里不得以其别名代替;最后请注意参与分组的字段不得超过10个。

还是以前例的数据为例来说明,前面我们来的各班的平均分,如果现在我们想知道平均分高于“7”的班级是哪些,就可以用以下SQL语句:

Select 班级, Avg(评分) AS 平均分

FROM 学生

GROUP BY 班级

HAVING Avg(评分) > 7;

运行后,返回结果如下:

班级    平均分

一班    7.3

从这个例子我们可以看出,返回的分组后的记录又被进行了一次条件筛选。

 



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助