3.2 通过向导创建查询
3.2.1 用简单查询向导生成查询
对于一些简单的查询需求,可以用Access提供的简单查询向导完成。下面通过例题说明。
【例3-1】生成“导师情况表”查询,要求能观察到导师的姓名、职称和所属系的编号。
(1)打开“研究生管理”数据库,单击“创建”选项卡中的“查询向导”按钮,弹出图3-1所示的“新建查询”对话框;选择“简单查询向导”选项,单击“确定”按钮进入查询向导的第1个对话框。
(2)查询向导的第1个对话框用于选择数据源,即数据来源于哪个/哪些表。先在“表/查询”下拉列表框中选择“导师”表;然后在“可用字段”列表框中选中所要查询的字段,单击按钮送到右侧的“选定字段”列表框中,如图3-2所示。如果要选取表中的所有字段,可以单击按钮;如果字段选择不当,单击按钮可将误选字段送回到“可用字段”列表框中;要送回全部的选定字段,则单击按钮。字段选定后单击“下一步”按钮,打开查询向导的第2个对话框。
图3-1 “新建查询”对话框
图3-2 从数据源中选择字段
(3)查询向导的第2个对话框也是向导的最后一个对话框,提示为查询对象指定一个名字,默认的名字为“导师查询”(与数据源的名字相关),本例更改成“导师情况表”,如图3-3所示。两个单选按钮提示查询生成后是打开查询对象观察查询结果,还是在查询设计视图中对已建查询作进一步修改,默认为前者;单击“完成”按钮结束查询的生成过程,导航窗格中出现“导师情况表”查询对象,同时该查询被打开,如图3-4所示。
图3-3 指定查询对象的名称
图3-4 “导师情况表”查询对象及其执行结果
图3-4(a)表明新建的查询有自己的图标,它作为对象保存在数据库中;在图3-4(b)中可观察到“导师情况表”查询打开后只有选择的3个列,但形式上完全与数据表相同。
说明:
(1)作为查询对象,“导师情况表”只是一条SQL命令,本身并不包含数据,但在执行时从数据源(“导师”表)抽取相关数据形成结果。所以查询对象是一个“虚”数据表。
(2)查询对象提供了多种视图方便用户操作,可以通过“开始”选项卡中的“视图”按钮或状态栏右部的“视图”按钮进行选择。“设计视图”采用图形化界面方便地设置查询要求;“SQL视图”可以编写SQL命令进行查询;“数据表视图”可以查看查询结果。
(3)如果打开查询对象时对数据进行更新、添加,则数据的变化实际发生在数据源(“导师”表)中。
(4)数据源如果被删除,则查询无法打开,并显示出错信息,如图3-5所示。
图3-5 因数据源被删除导致查询打开出错
【例3-2】用向导生成查询,显示每位导师的编号、姓名、职称及其所带研究生的学号、姓名和入学分数。
提示:本题的查询操作涉及导师和研究生两个表,要求正确地显示两者的对应关系,例如研究生“杨柳”的导师编号为“102”,说明他是导师“李向明”的研究生,他不应该和导师“陈平林”并列,因此完成本题的前提是“导师”表和“研究生”表之间必须已建立起一对多的表间关系。
(1)打开简单查询向导对话框,首先在“表/查询”下拉列表框中选择“导师”表,单击按钮将导师编号、姓名、职称字段送到右侧的“选定字段”列表框中;然后在同一向导对话框中再选择“研究生”表,单击按钮将表中的学号、姓名、入学分数字段送到“选定字段”列表框中,如图3-6所示。由于“导师”表的“姓名”字段与“研究生”表的“姓名”字段的列名相同,系统自动在字段名前加上表名和“_”以区别。字段选定后单击“下一步”按钮。
(2)在查询向导的第2个对话框中选择“明细(显示每个记录的每个字段)”单选按钮,如图3-7所示,单击“下一步”按钮。
图3-6 在两个相关表中分别选择字段
图3-7 确定采用明细查询还是汇总查询
(3)在查询向导的第3个对话框中,查询对象名称设定为“导师-研究生”,单击“完成”按钮。图3-8显示的是完成后执行查询的结果,反映了导师和研究生之间的从属关系。
图3-8 两个关联表的查询结果
仔细观察图3-8,可以发现:
①查询对象的字段名一般沿用数据表中的字段名,如果出现相同的字段名,系统自动在字段名前加上表的名字以示区别,如图3-8中的“导师_姓名”与“研究生_姓名”。
②“研究生”表中共有18个学生,但图3-8却只显示15条记录,这是因为有3个研究生目前没有导师编号,无法与任何导师产生联系,因此被排除在两个表的关联查询之外。
③“导师编号”“导师_姓名”“职称”列的数据重复出现,但导师李小严的编号、姓名和职称没有显示,因为她没有带研究生。
说明:如果“导师”表和“研究生”表之间尚未建立表间关系,则查询向导将关闭,同时会自动打开关系窗口,要求用户先建立两个表之间的一对多关系,然后再进行创建查询的操作。
3.2.2 交叉表查询
交叉表查询可利用查询向导创建,它用于显示表中某个字段的汇总值,包括总和、计数和平均等,并将它们分组,一组列在数据表的左侧,另一组列在数据表的上部,行列交叉部分显示某个字段的汇总值。例如,在研究生表中,如果希望看到不同性别研究生的各个专业入学平均分,就需要应用交叉表查询来实现。交叉表查询运行结果的显示形式类似于Excel中的数据透视表,有行标题、列标题、汇总值。
1.用向导生成交叉表
【例3-3】生成一个交叉表,显示不同性别不同研究方向各导师所带研究生的入学平均分。
(1)在数据库窗口中单击“创建”选项卡中的“查询向导”按钮,弹出“新建查询”对话框(见图3-1),选择“交叉表查询向导”选项,单击“确定”按钮进入查询向导的第1个对话框。
(2)在查询向导的第1个对话框中选择查询的数据源,数据源可以是表,也可以是查询,但只能有一个数据源。本例数据源选择“研究生”表(见图3-9),单击“下一步”按钮。
(3)在查询向导的第2个对话框中选择用作行标题的字段,最多可以选择3个。本例先选择“性别”字段,再选择“研究方向”字段,单击按钮将选定的字段送到右侧的列表框中,如图3-10所示,单击“下一步”按钮。
图3-9 选择交叉表查询的数据源
图3-10 选择交叉表的行标题
(4)在查询向导的第3个对话框中选择用作列标题的字段,只能选择一个。本例选择“导师编号”字段,如图3-11所示,单击“下一步”按钮。
(5)在查询向导的第4个对话框中选择行列交叉点的字段汇总方式,本例选择“入学分数”字段,汇总方式选择“avg”函数(平均),同时包含各行小计,如图3-12所示,单击“下一步”按钮。
图3-11 选择交叉表的列标题
图3-12 在交叉表向导中选择计算用字段
(6)在查询向导的最后一个对话框中命名交叉表,默认名称是“研究生_交叉表”;单击“完成”按钮,交叉表在生成后将自动打开,如图3-13所示。
图3-13 生成后的交叉表
注意:在该交叉表中,原来“导师编号”字段中的数据现在成了列名;记录导航按钮指示本交叉表有10行内容,与数据源“研究生”表的记录数无直接关系;有一个列的标题为“<>”,表示“导师编号”为空。
2.引用两个表的字段生成交叉表
【例3-4】生成一个交叉表,显示不同系不同性别的导师人数,要求使用系名,如图3-14(b)所示。
本题的难点在于交叉表向导无法同时引用两个表的字段,导师信息(“性别”“导师编号”字段)包含在“导师”表中,而“系名”字段包含在“系”表中。
解决方法:首先使用简单查询向导建立一个查询“例3-4查询”,包含“系”表中的“系名”字段和“导师”表中的“性别”“导师编号”字段,如图3-14(a)所示;然后根据这个查询用交叉表查询向导创建交叉表“例3-4查询_交叉表”,以“性别”为行标题,“系名”为列标题,“导师编号”作为汇总数据,使用的函数是“Count”,结果如图3-14(b)所示。
图3-14 生成各系不同性别导师人数交叉表