全面掌握MS ACCESS SQL(23)
时 间:2018-01-12 10:42:16
作 者:Big Young ID:252 城市:襄阳
摘 要: 用GROUP BY子句对返回记录进行分组。
正 文:
Access中的GROUP BY子句将指定的字段列表中具有相同值的记录组合成一个记录。如果在Select语句中包括SQL聚合函数(例如Sum或Count),则会为每个记录创建汇总值。
一、带GROUP BY子句的Select语句的基本语法
语法:
Select fieldlist
FROM table
Where criteria
[GROUP BY groupfieldlist]
包含GROUP BY子句的Select语句由以下部分组成:
部分 |
说明 |
Fieldlist |
要与任何字段名别名、SQL 聚合函数、选择谓词(ALL、DISTINCT、DISTINCTROW或TOP)或其他Select语句选项一起进行检索的字段的名称。 |
Table |
从中检索记录的表的名称。 |
Criteria |
选择条件。如果语句包含Where子句,则在将Where条件应用于记录之后,Microsoft Access数据库引擎对值进行分组。 |
Groupfieldlist |
用来对记录进行分组的最多10个字段的名称。groupfieldlist中字段名称的顺序确定了从最高到最低的分组级别。 |
几点说明:
1、GROUP BY是可选的。
2、如果Select语句中没有SQL聚合函数,则省略汇总值。
3、GROUP BY字段中的Null值将被分组,而不会省略。但是,在任何SQL聚合函数中都不会计算Null值。
4、使用Where子句可以排除不想分组的行,使用HAVING子句则可以在分组记录之后筛选这些记录。
5、除非GROUP BY字段列表中的字段包含Memo或OLE Object数据,否则,假如Select语句包含至少一个SQL聚合函数,则GROUP BY字段列表中的字段就可以引用FROM子句所列出的任何表中的任何字段,无论Select语句是否包含该字段。Microsoft Access数据库引擎无法对“Memo”或“OLE Object”字段进行分组。
6、Select字段列表中的所有字段都必须包括在GROUP BY子句中,或作为SQL聚合函数的参数包括在内。
二、SQL中GROUP BY的使用
“GROUP BY”从字面意义上理解就是根据“BY”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。ACCESS里“GROUP BY”子句通常要与聚合函数配合使用借以提取记录中的分组信息,最常用的SQL聚合函数包括Avg,Count,Max,Min和Sum等。
例如有一个名为“学生”的数据库表,内容如下:
"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 SQL里HAVING子句可以让我们筛选分组后的各组数据,即HAVING子句的作用是对分组准则做进一步规定,也就是可以对参与分组的字段和分组汇总信息做进一步的限定和筛选。它必须与GROUP BY子句配合使用,而不能像Where子句那样可单独使用,这是第一点;第二点HAVING子句里只能对出现在GROUP BY子句里的分组字段指定连接条件、限定或筛选,字段被用聚合函数(如sum、count、avg、min、max、first、last等)计算获取的分组汇总信息则不受限制,可随意对这些汇总信息做所需的限定;第三点与Where子句不一样,HAVING子句里无法识别字段别名,被限定的字段须使用原表字段名,而不得使用Select子句里所起的字段别名,输出字段如为计算表达式的如需对其值范围做HAVING限制,则必须以该表达式出现在HAVING子句里不得以其别名代替;最后请注意参与分组的字段不得超过10个。
还是以前例的数据为例来说明,前面我们来的各班的平均分,如果现在我们想知道平均分高于“7”的班级是哪些,就可以用以下SQL语句:
Select 班级, Avg(评分) AS 平均分
FROM 学生
GROUP BY 班级
HAVING Avg(评分) > 7;
运行后,返回结果如下:
班级 平均分
一班 7.3
从这个例子我们可以看出,返回的分组后的记录又被进行了一次条件筛选。
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)