第3章查询 【实验目的】 (1) 掌握表达式的计算。 (2) 掌握SQL命令的操作。 (3) 掌握选择查询和动作查询。 【实验环境】 (1) 台式计算机或笔记本电脑。 (2) Access 2016软件环境。 【实验内容】 某学校设计“项目管理”系统,包括“学院”表、“专业”表、“学生”表、“教师”表、“项目”表和“项目分工”表,每个表包含的字段如下: 学院(学院编号,学院名称,院长,办公电话) 专业(专业编号,专业名称,专业类别,学院编号) 学生(学号,姓名,性别,生日,民族,籍贯,专业编号,简历,登记照) 教师(工号,姓名,性别,职称,学院编号) 项目(项目编号,项目名称,项目类别,立项日期,完成年限,经费,是否完成,指导教师工号) 项目分工(学号,项目编号,分工) (1) 完成不同类型数据的表达式运算。 (2) 使用SQL命令进行查询和操作。 (3) 利用查询设计视图创建选择查询和交叉表查询。 (4) 动作查询操作。 实验3.1完成不同类型数据的表达式运算 【实验要求】 (1) 掌握Access 2016表达式和函数。 (2) 掌握SQL视图及在不同视图间切换。 图3.1视图列表 【实验步骤】 (1) 进入SQL视图及在不同视图间切换。 在Access中打开“项目管理”数据库。 单击“创建”选项卡“查询”组中的“查询设计”按钮,弹出查询设计窗口及“显示表”对话框。关闭“显示表”对话框,选择“设计”→“结果”→“SQL视图”命令,进入SQL视图窗口。 在SQL视图中输入SQL命令并单击“运行”按钮,就可以查看运行结果。如果需要在不同的视图之间切换,可单击“视图”的下拉按钮,则弹出所有视图列表,用户可在其中选择切换,如图3.1所示。 (2) 不同类型数据的表达式运算。 在SQL视图中分别输入以下命令,分别进入数据表视图查看结果。 SELECT-5.12^2+(17 mod 3); SELECT"Hello "+",World!",TRIM(" 清华大学 "),LEFT("清华大学出版社",2)+RIGHT("清华大学出版社",3); SELECT"你毕业的年份是", VAL(LEFT([你的学号],4))+4; SELECT "现在是"+STR(YEAR(DATE()))+"年","现在是"+STR(MONTH(DATE()))+"月","现在的时间是: "+STR(TIME())); SELECT "张三">"李四","ABCD"<"abcd",(DATE()-#1992-10-8#)>1000; 实验3.2使用SQL命令进行查询和操作 【实验要求】 (1) 掌握SQL中SELECT语句的主要应用。 (2) 掌握SQL的插入、更新、删除操作命令的基本应用。 (3) 了解SQL定义数据表的基本方法。 (4) 理解查询对象的意义和建立方法。 【实验步骤】 (1) 练习SQL查询的SELECT语句。 打开“项目管理”数据库窗口,进入SQL视图。 在SQL视图中输入以下SELECT命令,查看执行结果,并仔细体会查询的实现。 ① 查询“学院”“专业”“学生”表的完整数据。 SELECT * FROM ((学院 INNER JOIN 专业 ON 学院.学院编号=专业.学院编号) INNER JOIN 学生 ON 专业.专业编号=学生.专业编号); ② 查询“工商管理”专业所有女生信息。 SELECT 专业名称,学生.* FROM 专业 INNER JOIN 学生 ON 专业.专业编号=学生.专业编号 WHERE 专业.专业名称="工商管理" AND 学生.性别="女"; ③ 查询作为“项目负责人”的学生的学号、姓名、性别。保存为“负责人”查询。 SELECT 学生.学号,姓名,性别 FROM 学生 INNER JOIN 项目分工 ON 学生.学号=项目分工.学号 WHERE 分工="负责人" ; 单击“保存”按钮,弹出“另存为”对话框,输入“负责人”,单击“确定”按钮。 ④ 查询没有参与项目的学生的学号、姓名、专业名称。 SELECT 学号,姓名,专业名称 FROM 学生 INNER JOIN 专业 ON 学生.专业编号=专业.专业编号 WHERE 学号 NOT IN (SELECT 学号 FROM 项目分工); ⑤ 查询参与项目超过一项的学生的学号、姓名和参与项目数。 SELECT 学生.学号,姓名,COUNT(*) FROM 学生 INNER JOIN 项目分工 ON 学生.学号=项目分工.学号 GROUP BY 学生.学号,姓名 HAVING COUNT(*)>1; ⑥ 查询参与项目最多的学生的学号、姓名和参与项目数。 SELECT TOP 1 学生.学号,姓名,COUNT(*) AS 参与项目数 FROM 学生 INNER JOIN 项目分工 ON 学生.学号=项目分工.学号 GROUP BY 学生.学号,姓名 ORDER BY COUNT(*) DESC; ⑦ 查询与农村或农业有关的项目及负责人姓名。 SELECT 项目.*,姓名 FROM (学生 INNER JOIN 项目分工 ON 学生.学号=项目分工.学号) INNER JOIN 项目 ON 项目.项目编号=项目分工.项目编号 WHERE 分工="负责人" AND (项目名称 LIKE "*农业*" OR 项目名称 LIKE "*农村*"); (2) 练习SQL的创建表、插入、更新、删除操作命令。 ① 在“教师”表中添加一个新教工信息。 INSERT INTO 教师 VALUES("Z09031","杨飞","男","讲师","09"); ② 将“校级”项目的经费增加1000元。 UPDATE 项目 SET 经费=经费+1000WHERE 项目类别="校级"; ③ 创建“已结项项目”表,包括项目编号、项目名称、项目类别、指导教师工号、负责人学号。 CREATE TABLE 已结项项目 (项目编号 TEXT(10) PRIMARY KEY, 项目名称 TEXT(60) NOT NULL, 指导教师工号 TEXT(8) REFERENCES 教师(工号), 负责人学号 TEXT(8) REFERENCES 学生(学号) ); ④ 将已结项的项目转入“已结项项目”表,然后删除“已结项”的项目数据。 首先,执行如下语句。 INSERT INTO 已结项项目(项目编号,项目名称,指导教师工号,负责人学号) SELECT 项目.项目编号,项目名称,指导教师工号,学号 FROM 项目 INNER JOIN 项目分工 ON 项目.项目编号=项目分工.项目编号 WHERE 分工="负责人" AND 是否结项; 然后,执行如下语句。 DELETE FROM 项目 WHERE 是否结项; 实验3.3利用查询“设计视图”创建选择查询和交叉表查询 【实验要求】 (1) 掌握查询设计视图。 (2) 理解Access选择查询的意义和类别。 (3) 掌握一般选择查询的操作应用。 (4) 理解并掌握交叉查询的应用。 (5) 理解参数查询的意义。 【实验步骤】 (1) 设置选择查询。 打开“项目管理”数据库窗口,然后进入设计视图。 ① 查询“专业”表,显示开设的所有专业涉及的学科门类。 通过“显示表”对话框将“专业”表加入设计视图。在设计网格中“字段”栏选择“专业类别”字段并选中“显示”复选框。因为该字段的值有重复,因此,进入“属性表”对话框,选择“唯一值”的属性值为“是”。 ② 查询所有专业涉及的学科门类,以及每个学科门类开设的专业数,并仅显示开设专业数为2个以上的学科门类及其专业数信息,显示信息为专业类别、专业数。 通过“显示表”对话框将“专业”表加入设计视图。在设计网格中“字段”栏选择“专业类别”和“专业编号”字段并选中“显示”复选框。然后,单击工具栏中的“汇总”按钮增加“总计”栏,将“专业类别”字段设置为“Group By”,将“专业编号”字段设置为“计数”。在“专业编号”字段的“条件”栏输入“>2”。最后,在“专业编号”的“字段”栏的“专业编号”前面加上“专业数:”作为查询后的列名。设计完成,如图3.2所示。 图3.2选择查询设计视图1 ③ 查询各专业学生的人数。 将“专业”表和“学生”表加入“设计视图”。在“字段”栏选中“专业编号”和“专业名称”字段并选中“显示”复选框,然后,单击工具栏中的“汇总”按钮增加“总计”栏。将“专业编号”和“专业名称”字段设置为“Group By”,然后选择“学生”表的“学号”字段,设置其为“计数”,最后,在“学号”前面加上“人数:”作为查询后的列名。设计完成,如图3.3所示。 图3.3选择查询设计视图2 ④ 查询18岁以上男学生人数超过3人的各专业信息,显示输出信息为符合条件专业的专业名称和18岁以上男学生人数。 将“专业”表和“学生”表加入设计视图。在“字段”栏选中专业表的“专业编号”、学生表的“学号”和“性别”字段并选中“显示”复选框,然后单击工具栏中的“汇总”按钮增加“总计”栏。将“专业编号”字段设置为“Group By”,然后选择“学生”表的“学号”字段,设置其为“计数”。在“学号”字段的“条件”栏输入“>3”; 在“性别”字段的“总计”栏选择“Where”选项,并在“条件”栏输入"男"。并在“字段”栏中增加一个计算字段“年龄: Year(Date())-Year([生日])”,在该字段的“总计”栏选择“Where”选项, 并在“条件”栏输入“>18”。最后,在“学号”前面加上“18岁以上男学生人数:”作为查询后的列名。设计完成,如图3.4所示。 图3.4选择查询设计视图3 ⑤ 查询没有参与项目的男学生学号、姓名,即“项目分工”表中没有记录的学生。 设计过程如图3.5所示。将“学生”表加入设计视图。选择“学号”“姓名”字段并选中“显示”复选框,在第3列处输入“注: ‘未参与项目’”,选中“显示”复选框。然后,在第4列中选择“学号”但不显示,只作为比较的对象。在“条件”栏输入一个子查询“NOT IN (SELECT 学号 FROM 项目分工)”。 图3.5选择查询设计视图设计子查询 设置完毕,运行结果如图3.6所示。 图3.6选择查询数据表视图 (2) 设置交叉表查询。 ① 查询每位学生在各个项目中的分工情况。 两类实体多对多联系可设置交叉查询。将学生的“学号”和“姓名”作为行标题,“项目编号”作为列标题,“分工”作为交叉数据,生成交叉表。 在查询设计视图,添加“学生”和“项目分工”表。在设计窗格中添加“学号”“姓名”“项目编号”“分工”字段。 单击“交叉表”按钮,添加“总计”栏和“交叉表”栏。在“交叉表”栏设置“学号”和“姓名”作为行标题,“项目编号”作为列标题,“分工”作为“值”,在“总计”栏设置分工为“First”。这样交叉表查询就设计完毕,如图3.7所示。 图3.7查询设计视图中设计交叉表1 运行查询,可以看到交叉表查询的效果,如图3.8所示。 图3.8交叉表查询结果1 ② 查询每位学生在各个项目中的分工情况,并对每位学生参与的项目数进行统计。 和上面类似,此处针对每个学生仅增加了一个统计信息——参与项目总数,那么在交叉表中如何进行设计呢? 在查询设计视图中设计交叉表,如图3.9所示。在上面的基础上,在查询设计视图中,在“字段”栏中增加“项目编号”字段,并在“总计”栏选择“计数”,“交叉表”栏设置为“行标题”。最后在“项目编号”前面加上“项目计数:”作为查询后的列名。设计完成,查询结果如图3.10所示。 图3.9查询设计视图中设计交叉表2 图3.10交叉表查询结果2 (3) 设置参数查询。 通过参数查询指定日期以后出生的某个民族的学生信息。 将“学生”表加入查询设计视图,在设计窗格中选择“*”表示输出“学生”表所有字段。然后,选中“生日”字段,不选中“显示”复选框,在条件行输入“>[SR]”; 同样设置“民族”字段。 接下来,单击“参数”按钮,弹出“查询参数”对话框,分别设置“SR”和“MZ”的类型,单击“确定”按钮,设置完毕,如图3.11所示。 图3.11在查询设计视图中设置查询参数 实验3.4动作查询操作 【实验要求】 (1) 理解Access动作查询包含的查询类别。 (2) 理解并掌握动作查询的操作应用。 (3) 将动作查询与SQL命令进行对比。 【实验步骤】 (1) 生成表查询操作。 创建“已结项项目”表,包括项目编号、项目名称、项目类别、指导教师工号、负责人学号。 进入查询设计视图,添加“项目”和“项目分工”表。设置“项目编号”“项目名称”“指导教师工号”“学号”“是否结项”字段并设置相应条件。然后单击“生成表”按钮,弹出“生成表”对话框。操作如图3.12所示。输入生成表的名称,单击“确定”按钮。运行查询,结果被保存到当前数据库中。 由于生成表中有指导教师工号和学生学号,因此可到关系图窗口中建立相应的参照。 图3.12定义生成表查询 生成的新表如图3.13所示。 图3.13“已结项项目”表 (2) 删除查询操作。 删除“项目”表中已结项的项目数据。 进入查询设计视图,加入“项目”表。单击“删除”按钮,这时设计窗格栏目发生变化,出现“删除”栏。添加“[是否结项]”字段并设置“删除”栏为“Where”,对应“条件”为“True”,直接单击“运行”按钮即可,如图3.14所示。 图3.14删除查询设计操作 (3) 追加查询操作。 追加查询是将一个查询的结果追加插入到一个现有表中。将本实验的生成表查询操作通过追加查询完成。 在查询设计视图中添加“项目”和“项目分工”表。设置“项目编号”“项目名称”“指导教师工号”“学号”“是否结项”字段并设置相应条件,单击“追加”按钮,弹出“追加”对话框。输入“已结项项目2”,如图3.15所示,单击“确定”按钮。这时,设计窗格中增加“追加到”栏并显示相关的字段名。单击“运行”按钮,完成数据记录的追加。 图3.15“追加”对话框 (4) 更新查询操作。 将“校级”项目经费增加1000元,操作如下。 在设计视图中添加“项目”表。单击“更新”按钮,设计窗格增加“更新到”栏。 添加“经费”字段,然后在“更新到”栏中输入“[经费]+1000”。 添加“项目类别”字段,在“条件”栏中输入“校级”,设计完成,如图3.16所示。 单击“运行”按钮运行查询,即可完成“项目”表的更新操作。 图3.16更新查询操作