第3章查询
学习目标(1) 掌握查询的概念、使用查询向导和查询设计视图创建查询的方法。
(2) 掌握Access的运算法则及表达式的构建方法。
(3) 掌握各类常用函数的使用方法。
(4) 掌握创建选择查询和利用查询对象实现统计计算的方法。
(5) 掌握参数查询、交叉表查询、操作查询的创建。

査询是Access处理和分析数据的主要工具,它能够按照查询规则抽取多个数据库表中的数据,供用户査看、统计、分析和操作。在日常工作中,查询是数据库终端用户最常用的对象。本章将详细介绍査询的概念、功能及各类查询的创建和使用方法。
3.1查询概述〖*4/5〗3.1.1查询对象的特点査询对象的主要功能是根据用户给定的条件对表或其他查询进行检索,筛选出符合条件的记录,构成一个新的记录集合,从而便于用户对数据进行查看和分析。在Access中,査询对象具有合并显示不同表中的数据、统计计算、添加记录、修改记录和删除记录等功能。查询还可作为窗体、报表等其他Access对象的数据源。
运行查询对象是Access系统按照查询的条件从数据表中提取数据的过程。尽管查询运行后以数据表的形式显示结果,但二者有本质的不同,表是存储原始数据的对象,而查询并不存储原始数据,仅保存数据获取的方法和条件,即操作数据的命令。查询对象每次运行时都按照其定义的规则从数据源提取数据,保证了与数据源的同步。
3.1.2查询的类型
查询可从不同角度进行分类。如果以是否更改数据源的数据为标准,查询可以分成选择查询和操作查询。
1. 选择查询
选择查询是根据查询准则从一个或多个表中获取数据并显示结果,可对记录进行分组、总计、计数、平均值等运算。选择查询不会改变数据源。选择查询按照创建方法、条件表达方式的不同又分为一般的选择查询、交叉表查询、参数查询、SQL查询。
(1) 参数查询可以在运行时让用户利用输入查询条件,增加了查询的灵活性。
(2) 交叉表查询实现对数据表的行和列数据进行统计计算,提供了独特的数据概括形式,供用户分析使用。
(3) SQL查询是直接使用SQL建立的查询,某些复杂查询若无法用Access的查询设计器创建,就必须使用SQL创建。
2. 操作查询
操作查询不仅可以获取数据,还可以对数据进行修改、更新。操作查询有4种: 生成表查询、删除查询、更新查询和追加查询。
(1) 生成表查询将查询的记录集保存成一个新表。
(2) 删除查询用来删除表中的记录。
(3) 更新查询可以对表中的记录进行批量修改。
(4) 追加查询则是将某个表中符合条件的记录添加到另一个表中。
操作查询也可以是参数查询,在执行时输入条件参数。
3.1.3查询视图
Access系统提供了3种主要的查询视图,用户在查询对象的设计过程中,可以在几种视图中切换,以便随时查看运行结果、返回设计器界面、进行其他数据分析。3种视图名称及功能说明如下。
(1) 设计视图: 用来编辑、修改各类查询。
(2) 数据表视图: 显示查询对象运行结果。
(3) SQL视图: 显示查询对象对应的SQL命令。在此视图下可直接输入和修改SQl命令。
3.2运算符、表达式和函数
设置查询条件是创建查询对象的重要内容,查询条件的表达式由运算符和操作数组合而成,其中,运算符包括算术运算符、关系运算符、逻辑运算符等,操作数包括各类常量、变量、函数等。查询条件是一个逻辑表达式,其运算结果为“真”或“假”。运行查询时,将对每一条记录计算条件表达式的值,以决定记录是否包含在查询的结果记录集中。
3.2.1常量
Access 系统中有4种常量: 数值型常量、字符型常量、日期型常量和逻辑型常量。4种常量在表达式中的表示方法如下:
(1) 数值型常量。直接输入数值,如76,-138.56,2e-3等。
(2) 字符型常量。以英文单或双引号界定,如'数据库',"计算机"。
(3) 日期型常量。用符号#界定,如#2019831#。
(4) 逻辑型常量。Yes、No、True、False、On、Off、-1、0。其中Yes、True、On、-1表示“真”,No、False、Off、0表示“假”。
3.2.2运算符〖*4/5〗1. 算术运算符算术运算符的操作数为数字型数据,其运算结果也是数字型。表31列举了Access的算术运算符及其功能。
算术运算符的运算优先级依次为: 括号,乘方(^),乘除(、/),整除和模运算(\\、mod),加减(+、-)。表31Access的算术运算符及其功能
运算符功能表达式示例结果 ^乘方2^38乘法3412 /除法5/22.5\\整除(不四舍五入)-5\\2-2mod求余 -5 mod 2结果为-1,余数与被除数符号相同 +加法5+27-减法5-232. 关系运算符
关系运算符用于各类数据的比较。Access中,数值型、短文本、长文本、日期型、逻辑型数据均可以进行关系运算。关系运算的结果为逻辑型。
Access的关系运算符及其功能见表32。表32Access的关系运算符及其功能
运算符功能表达式示例含义<小于<100小于100<=小于或等于<=100小于或等于100>大于>#2019128#大于2019年12月8日>=大于或等于 >=“山东省”大于或等于“山东省”续表
运算符功能表达式示例含义=等于=“优”等于“优”<>不等于<>”男” 不等于“男”Between…and介于两值之间Between 10 and 20在10和20之间,包含10和20In在一组值中In(“优”,“良”,“中”,“及格”)字符串“优”“良”“中”和“及格”中的一个 Is Null字段为空姓名Is Null “姓名”字段为空Is Not Null字段非空 姓名Is Not Null “姓名”字段不为空Like匹配模式姓名Like “王”“姓名”字段以“王”开头Access的通配符见表33。表33Access的通配符
符号功能举例含义 ?匹配任意一个合法字符Like “李?”以“李”开头、后有一个字符的字符串匹配任意多个合法字符Like “玉”包含“玉”的字符串#匹配任意一个数字Like “##”末尾是两个数字的字符串[]匹配集合中的任意一个字符Like “[玉,雨,渔]”包含“玉”“雨”“渔”三者之一的字符串[!]匹配不在集合中的任意字符Like “[!玉,雨,渔]”不包含“玉”“雨”“渔”任何一个的字符串3. 逻辑运算符
逻辑运算符常用于复杂条件的表达,其运算操作数和运算结果均为逻辑型。
逻辑运算符的优先级依次为: 括号,非(Not),与(And),或(Or),见表34。表34逻辑运算符
运算符功能举例含义Not逻辑“非”Not Like “李”不以“李”开头的字符串 And逻辑“与”>=100 And <=200在100和200之间Or逻辑“或”<10 Or >20小于10或者大于204. 连接运算符
连接运算符用于字符串类型数据的运算,见表35。表35连接运算符
运算符功能举例结果+连接字符串“中国”+“北京”“中国北京” &连接字符串或数字串“中国”& 999“中国999”连接运算符“+”和“&”的差异在于,“+”号要求两边必须是字符型数据,“&”号两边的操作数可以是字符型,也可以是其他类型,连接后得到新字符串。
5. 日期运算符
日期运算符用于日期类型数据的运算,主要是时间间隔相关的运算,见表36。表36日期运算符
运算符功能举例结果+计算一段时间后的日期#20190101#+1020190111计算一段时间前的日期或两个日期的间隔天数#20190101#10
#20190110##20181220#20181222
21说明: 两个日期型数据不能相加。
6. 运算优先级规则
当表达式中有不同类别的运算符时,运算优先级依次为: 函数运算、算术运算符、连接运算符/日期运算符、关系运算符、逻辑运算符。同类运算符按照其各自的优先级运算。
3.2.3函数
Access系统提供了多种内置标准函数,完成不同功能的运算。函数类型包括数学函数、字符函数、日期/时间函数和统计函数等。函数常用于构造查询规则和进行各种统计计算。
1. 常用的数学函数
(1) 绝对值函数: Abs(<数值表达式>)
功能: 返回<数值表达式>的绝对值。
举例: Abs(-3)  的返回值为3。
(2) 向下取整函数: Int(<数值表达式>)
功能: 返回不大于<数值表达式>的整数,参数为负值时,返回小于或等于参数值的第一个负数。
举例: Int(3.14) 的返回值为3,Int(-3.14) 的返回值为-4。(3) 取整函数: Fix(<数值表达式>)
功能: 返回<数值表达式>的整数部分,参数为负值时,返回大于或等于参数值的第一个负数。
举例: Fix(3.14) 的返回值为3,Fix(-3.14) 的返回值为-3。
(4) 舍入函数 Round(<数值表达式1>[,<数值表达式2>])
功能: 按照指定的小数位数对<数值表达式1>进行四舍五入运算。<数值表达式2>是保留小数点的位数,省略表达式2时,默认保留整数。
举例: Round(3.258,1) 的返回值为3.3,Round(3.754) 的返回值为4。
(5) 随机函数 Rnd 
功能: 返回一个0到1的随机数值。
举例: Rnd返回0到1的随机小数,Int(Rnd100)返回0到100的随机整数。
(6) 开平方函数Sqr(<数值表达式>)
功能: 计算<数值表达式>的平方根。
举例: Sqr(9)的返回值为 3。
2. 字符串函数
(1) 字符串长度检测函数Len(<字符表达式>)
功能: 返回字符串所含字符数。
举例: Len("12345")的返回值是5,Len(“考试中心”)的返回值是4。
(2) 字符串截取函数Left (<字符表达式>,<n>)
功能: 返回字符串表达式左边起截取的n个字符。
举例: Left ("中国China",2) 的返回值是“中国”。
(3) 字符串截取函数Right(<字符表达式>,<n>)
功能: 返回字符串表达式右边起截取的n个字符。
举例: Right("中国China",2) 的返回值是“na”。
(4) 字符串截取函数Mid(<字符表达式>,<n1>,[<n2>])
功能: 从字符串表达式左边第n1个字符起截取n2个字符,省略n2时,截取至字符串末尾。
举例: Mid("中国China",3,2) 的返回值是“Ch”。
(5) 大小写转换函数Ucase(<字符表达式>)和Lcase(<字符表达式>)
功能: 将字符串中的小写字母转换成大写字母或将字符串中的大写字母转换成小写字母。
举例: Ucase("hello")的返回值为“HELLO”,Lcase("SUN")的返回值为“sun”。
3. 日期时间函数
(1) Now()函数
功能: 返回当前计算机系统设置的完整日期和时间,包括年、月、日、小时、分、秒。
举例: Now()返回格式如“yyyy/mm/dd hh:nn:ss”的当前日期和时间。
(2) Date()函数
功能: 返回当前计算机系统设置的日期。
举例: Date()返回格式如“yyyy/mm/dd”的当前日期。
(3) Time() 函数
功能: 返回当前计算机系统时间。
举例: Time()返回,格式如“hh:nn:ss”的当前计算机系统时间。
(4) CDate(<字符表达式>)函数
功能: 将字符串转化成为日期,如字符串不是正确的日期表达式,则系统提示出错。
举例: CDate("2018/4/5")的返回值为对应字符串的日期型数据。
(5) Year(<日期表达式>)函数
功能: 返回日期表达式中表示年份的整数。
举例: Year("00615") 返回整数2000,Year(#00615#+300)返回整数2001。
说明: 返回值为数值型数据。
(6) Month(<日期表达式>)
功能: 返回日期表达式中表示月份的整数,其值为1~12。
举例: Month("00615")的返回值为6。
(7) Weekday(<日期表达式>)
功能: 返回日期表达式对应的日期数值,星期日至星期六分别对应整数1~7。
举例: Weekday("2019615")的返回值为7,也就是星期六。
4. 聚合函数 
聚合函数用在SQL语句中,实现对表中的字段或表达式进行各类统计运算。
(1) 平均值函数 Avg(<数值表达式>)
功能: 求一组记录内的某个数值型字段或数值表达式的平均值。
举例: Avg(<score>) 返回score字段的平均值。
(2) 计数函数Count(字段名/)
功能: 统计字段值不为Null的记录条数。
举例: Count(<name>)返回name字段的值不是Null的记录条数,Count()返回总记录数。
(3) 最小值函数Min(<表达式>)和最大值函数Max(<表达式>)
功能: Min、Max函数返回一组记录中表达式的最小值和最大值。
举例: Min(score) 返回score字段的最小值,Max(birthday)返回birthday字段的最大值。
(4) 求和函数 Sum(<数值表达式>)
功能: 返回一组记录中某个数值型表达式或字段的合计。
举例: Sum(<score>) 返回多条记录的score字段的和。
(5) First(<表达式>)和Last(<表达式>)函数
功能: First(表达式)返回查询所得结果集的第一条记录的表达式值,Last(表达式)返回最后一条记录的表达式值。
举例: First(name)返回查询结果集中第一条记录的name字段值。
5. 域聚合函数
Access支持两种类型的聚合函数: 域聚合函数和 SQL 聚合函数。两者具有相似的功能,但用于不同的场合并且函数格式不同。SQL 聚合函数可以在 SQL 语句的语法中使用,但不能直接在VBA代码中调用,而域聚合函数可以直接在VBA代码中调用。域是指某个记录集,可以是数据表或查询等。
(1) DCount函数
格式: DCount(<表达式>,<域>[,<条件>]) 
功能: 返回特定域中符合条件的记录数。
举例: DCount("ID","student","code='01'"),返回student表中字段code值为“01”的记录数。
(2) DAvg函数
格式: DAvg(<数值表达式>,<域>[,<条件>]) 
功能: 返回特定域中<数值表达式>的平均值,只统计符合筛选条件的记录。
举例:DAvg("score","score","ID='2017010101'"),返回score表中ID字段值为"2017010101"的记录的score字段平均值。
(3) DSum函数
格式: DSum(<数值表达式>,<域>[,<条件>]) 
功能: 返回特定域中<数值表达式>的和,只统计符合筛选条件的记录。
举例: Dsum("score","score","ID='2017010101'"),返回score表中ID字段值为"2017010101"的记录的score字段总计值。
(4) DMax|Dmin函数
格式: DMax|Dmin(<数值表达式>,<域>[,<条件>])
功能: 返回特定域中<数值表达式>的最大|最小值,只统计符合筛选条件的记录。
举例: Dmin("score","score","ID='2017010101'"),返回score表中ID字段值为"2017010101"的记录的score字段最小值。
(5) DSum函数
格式: DLookup(<表达式>,<域>[,<条件>]) 
功能: 返回特定域中符合条件的<表达式>的值。
举例: DLookup("name","student","ID='2018020101'"),返回student表中学号字段为"2018020101"的学生姓名。
6. 逻辑判断函数
Iif函数的格式及功能如下。
格式: Iif(<条件表达式>,表达式1><表达式2>) 
功能: <条件表达式>值为true时,返回<表达式1>的值,反之返回<表达式2>的值。
举例: Lif(score>=90,"优秀","一般")。
3.3创建选择查询
选择查询是最常用的查询,它按照查询规则从一个或多个表中抽取数据,以二维表的形式输出结果,并可以设置数据的分组、统计和排序方式。创建选择查询可以使用查询向导或设计视图实现。
3.3.1使用查询向导
Access提供了4种查询向导,用户可利用它们快速建立查询。选择“创建”→“查询”→“查询向导”,打开“新建查询”对话框,如图31所示。
图31“新建查询”对话框
1. 简单查询向导
简单查询向导可帮助用户快速建立查询,但不能设置查询规则和排序方法。
【例31】利用简单查询向导创建查询,显示student表中学生的学号、姓名、性别、出生日期信息。
操作步骤如下:
(1) 打开xsgl数据库,选择“创建”选项卡,单击“查询向导”按钮。
(2) 在图31所示的“新建查询”对话框中选择“简单查询向导”选项。
(3) 在图32所示的对话框中选择表student及4个字段,单击“下一步”按钮。
(4) 在对话框中输入查询名称,单击“完成”按钮。
(5) 查询运行结果如图33所示。
图32选择数据源
图33查询运行结果
2. 交叉表查询向导
交叉表查询是一种分类汇总查询,显示某个字段或表达式在行和列两个维度的分类汇总值,如求和、平均值、计数、最大值、最小值等。建立交叉表查询时,要选择行标题字段、列标题字段和汇总字段,行标题字段显示在交叉表左端,列标题字段显示在交叉表顶端,汇总字段的统计值显示在行和列的交叉处。建立交叉表查询一般有4个步骤。
(1) 选择源数据表或查询。
(2) 选择作为行标题的字段,最多可以选3个字段。
(3) 选择作为列标题的字段。
(4) 选择汇总字段和汇总方式。
【例32】利用查询向导建立交叉表查询,显示student表中各学院的男、女生人数。
操作步骤如下:
(1) 打开xsgl数据库,选择“创建”选项卡,单击“查询向导”按钮。
(2) 在图31所示的“新建查询”对话框中单击“交叉表查询向导”。
(3) 在图34所示的对话框中选择表student,单击“下一步”按钮。
图34 交叉表查询向导之一
(4) 选择code(学院代码)作为行标题字段,单击“下一步”按钮。
(5) 选择sex(性别)作为列标题字段,单击“下一步”按钮。
(6) 在图35中选择ID字段作为汇总字段,选择汇总方式为“计数”。
(7) 输入查询名称,之后可以查看结果或进入设计视图修改。例32运行结果如图36所示。
3. 查找重复项查询向导
数据表记录由于各种原因会存在重复记录,“查找重复项查询向导”可以在表中查找并显示这些重复数据,以帮助用户进行数据对比。
【例33】利用查询向导查找student表中家庭地址重复的记录。
操作步骤如下:
(1) 打开xsgl数据库,在图31所示的“新建查询”对话框中单击“查找重复项查询向导”,之后单击“确定”按钮,打开“选择数据源”对话框。
(2) 在对话框中选择表student,单击“下一步”按钮。
(3) 在打开的对话框中,将包含重复信息的字段nativeplace添加到“重复值字段”列表框中,如图37所示,单击“下一步”按钮。图35 交叉表查询向导之二
图36例32运行结果
图37选择重复字段(4) 选择需要同时显示的字段name、sex,单击“下一步”按钮。
(5) 输入查询的名称,可使用系统默认名称。
(6) 单击“完成”按钮,运行结果如图38所示。
图38查找重复项查询运行结果
4. 查找不匹配项查询向导
不匹配项查询的作用是对两个表进行比较,找出其中一个表中存在而另一个表中没有的记录。
【例34】查找没有被选修过的课程,即查找course表中存在,而score表中没有的记录。
分析: C_code字段唯一代表一门课程,所有被选修过的课程的C_code值都会在score表中存在,假如course表中有某个C_code值在score表中不存在,则说明此课程未被选修过。在创建查找不匹配项查询时,C_code可以作为course表和score表的匹配字段。
操作步骤如下:
(1) 打开xsgl数据库文件,在图31所示的“新建查询”对话框中单击“查找不匹配项查询向导”。
(2) 在对话框中选择第一个表course,单击“下一步”按钮。
(3) 在对话框中选择第二个表score,单击“下一步”按钮。
(4) 在图39所示的对话框中选择要匹配的字段C_code,单击“下一步”按钮,打开“显示字段选择”对话框。
(5) 在图310所示的对话框中选择需要显示的字段C_code和C_name,单击“下一步”按钮。
(6) 输入查询的名称,也可使用系统默认名称。
(7) 单击“完成”按钮,未被选修课程查询运行结果如图311所示。图39查找不匹配项查询向导匹配字段的选择
图310查找不匹配项查询向导显示字段的选择
图311未被选修课程查询运行结果
3.3.2使用查询设计视图
使用查询设计视图可以创建相对复杂的查询,如条件查询、分组汇总、排序、参数查询等,还可以打开已经建立的查询进行修改。
1. 利用设计视图创建查询的基本方法
设计视图创建查询一般有5个步骤:
(1) 选择查询的数据源,可以是一个或多个数据表或其他查询。
(2) 设置查询输出项,即要输出的字段或表达式。
(3) 设置查询的分组和排序方式。
(4) 设置筛选条件。
(5) 保存并运行查询。
2. 查询设计视图界面介绍
如图312所示,查询设计视图窗口由工具栏、数据源显示区、输出列设置区构成。其中,输出列设置区由若干行组成,各行的作用和设置方法说明如下。
图312查询设计视图窗口(1) 字段: 设置要输出的字段或表达式。表达式可通过选项卡“设计”→“查询设置”→“生成器”启动表达式生成器完成输入。
(2) 表: 显示字段的来源表或查询的名称。
(3) 总计: 如果此行显示,表示此查询涉及分组计算,需要设置分组计算的方法,如合计、平均值、最大值、最小值、First、Last等。
说明: 总计行并不自动显示,用户通过单击工具栏上的“汇总”按钮控制此行是否显示。
(4) 排序: 选择查询结果排序方法,有“降序”“升序”“不排序”3种方式。
(5) 显示: 设置哪些字段或表达式显示在查询结果中。如不选中复选框,则此字段可以用来分组、设置筛选条件、排序等,但查询结果中不显示。
(6) 条件: 设置查询条件。处于同一行的查询条件形成逻辑“与”关系。
(7) 或: 设置存在逻辑“或”关系的查询条件。
【例35】在xsgl数据库的student表中,查询所有学生的学号、姓名、性别、生日信息。
操作步骤如下:
(1) 打开xsgl数据库,在“创建”选项卡中单击“查询设计”按钮。
(2) 在显示表对话框中添加表student,单击“关闭”按钮。
(3) 在图313所示的对话框中选择题目要求的输出字段。
图313选择输出字段
(4) 完成设计,切换到数据表视图,运行结果如图314所示。
图314例35运行结果
【例36】查询xsgl数据库中山东省籍学生的每门课程的成绩。要求建立选择查询s2,显示student.ID、student.name、course.C_name、score.score、student.nativeplace这5个字段。按ID字段升序排序。
操作步骤如下:
(1) 打开xsgl数据库,在“创建”选项卡中单击“查询设计”按钮。
(2) 在“显示表”对话框中依次添加表student、course、score,单击“关闭”按钮。
(3) 在图315所示的对话框中,选择题目要求的输出字段。
(4) 设置student.ID字段的排序方式为“升序”。
(5) 设置nativeplace字段的条件行如图315所示。
图315例36的查询设计视图
(6) 在工具栏上单击“运行”按钮,运行结果如图316所示。
图316例36运行结果
(7) 在标题栏单击“保存”按钮,输入查询的名称s2。
3.3.3分组与计算查询
如果查询的输出列不是原始字段,需要计算得出,则称为计算列。计算列表达式可以直接在设计视图下部的“字段”行输入,也可以用表达式生成器建立。输入表达式应特别注意以下4点。
(1) 表达式要符合Access的运算规则,操作数与运算符匹配。
(2) 表达式中引用字段名需要加方括号“[]”。
(3) 表达式中使用的各种运算符、标点符号必须是ASCII码字符。
(4) 计算列的标题定义方法为<列标题>: <表达式>【例37】查询xsgl数据库中所有学生的选课数、课程平均成绩。要求建立查询s3,输出信息包括学号、姓名、年龄、选课数量、平均分。按学号升序排序。
分析: 本例题中,数据源是student、score表,输出列为年龄、选课数量、平均分均为计算列。年龄计算表达式为: Year(Date())-Year([birthday])。选课数量和平均分计算涉及分组合计,分组字段是student.ID,相关聚合函数分别为Count()和Avg()。
操作步骤如下:
(1) 打开xsgl数据库文件,打开“查询设计视图”窗口。
(2) 添加数据源student和score表。
(3) 单击“设计”→“显示隐藏”→“汇总”按钮,增加“总计”行。
(4) 在“字段”行选择student.ID、student.name、score.c_code、score.score。
(5) 对字段student.ID、student.name、score.c_code、score.score,通过下拉列表分别将各字段的总计行设置为:Group By、First、计数、平均值。
(6) 选中score.c_code字段,单击“设计”→“查询设置”→“插入列”,在score.c_code字段前插入一列,在此列输入年龄计算表达式和列标题,其对应的“总计”行,设置为First,如图317所示。
图317例37的设计视图(7) 选择“保存”按钮,输入查询名s3。运行查询,结果如图318所示。
图318例37运行结果
【例38】查询xsgl数据库中会计学院学生每人获得的学分合计,要求建立查询s4,输出信息包括学号、姓名、性别、学分合计,按学号升序排序。
分析: 本题中,数据源包括student、score、course和college表,获得学分的条件是课程成绩及格,score.score、college.name字段并不显示,只用于设置筛选条件,分组字段是student.ID,计算所获学分用函数Sum()。
操作步骤如下:
(1) 打开xsgl数据库文件,打开“查询设计视图”窗口。
(2) 添加数据源student、score、 course和college表并增加“总计”行。
(3) 在“字段”行选择student.ID、student.name、student.sex、score.score、college.name、course.credit。
(4) 取消勾选college.name和score. score字段的“显示”复选框,并将其“总计”行设置为Where,筛选条件设置如图319所示。
(5) 字段student.name、student.sex、score. score的“总计”行设置如图319所示。
(6) 保存查询,输入查询名s4。运行查询,结果如图320所示。
图319例38的设计视图
图320例38运行结果
【例39】查询每个学院、每个专业的男女生学生人数,输出信息包括学院名称、专业名称、性别、学生人数。
分析: 本题数据源包括student、major和college表,是多级分组统计,分组字段分别为college.code(学院代码)、major.m_name(专业名称)和student.sex(性别) 。
操作步骤如下:
(1) 打开xsgl数据库文件,打开查询设计视图,添加数据源college和major、 student表。单击“设计”→“显示/隐藏”→“汇总”按钮,增加“总计”行。
(2) 在“字段”行选择college.code、college.name_c、major.m_name、student.sex、student.id、college.code字段,设置各字段的汇总方式,如图321所示。
图321例39设计视图
说明: 在college和major、student 3个表连接时,系统自动使用了3个表的学院代码(code)值相等作为连接条件,但由于同一学院不同专业的学生具有相同的学院代码,所以连接结果有错误。由于学生的学号字段(ID)中的5~8位代表专业代码,所以增加筛选条件“(mid(student.id,5,4)=m_code)”即可筛选掉错误的连接记录。
(3) 设置保存查询对象名称为“查询专业人数”。运行查询,结果如图322所示。
图322例39运行结果
说明: 财务管理专业只有男生。