在Access中某些查询不能在查询设计视图中实现,这些查询称为SQL特定查询,包括联合查询、传递查询、数据定义查询和子查询。
1.联合查询
联合查询将两个或多个表或查询中的对应字段合并到查询结果的一个字段中。使用联合查询可以使用多个表中的数据。
联合查询使用Union语句来合并两个或更多选择表或查询的结果。
例4-39 在“教学信息管理”数据库中利用联合查询查找所有的女老师和女学生,并在查询结果中标记出类别是“学生”还是“老师”,查询命名为“例4-39 SQL联合查询。
(1)打开“教学信息管理”数据库,打开查询设计视图,切换到SQL视图。
(2)在SQL视图中输入如下语句:
(3)单击“运行”按钮,查看结果如图4-118所示。
图4-118 SQL联合查询部分结果
(4)保存查询为“例4-39 SQL联合查询”。
2.传递查询
传递查询使用服务器能接受的命令且直接将命令发送到ODBC数据库。使用传递查询可以不必链接到服务器上的表而直接使用它们。传递查询对于在ODBC服务器上运行存储过程也很有用。
3.数据定义查询
数据定义查询参阅4.6.3节。
4.子查询
子查询又叫嵌套查询,当一个查询的结果是另一个查询的条件时,即在一个Select语句的条件里边出现另一个Select语句,此查询称为嵌套查询。条件语句中的Select语句称为子查询,SQL语句允许多层嵌套,但使用的Order By子句,只对最终结果排序。子查询必须与其他查询相结合,不能作为一个单独的查询。嵌套查询由里向外执行,先处理内层查询,再处理外层查询。
例4-40 查询成绩高于平均分的学生信息,显示“学号”“姓名”“成绩”和“平均成绩”,查询保存为“例4-40高于平均分的学生信息”。
操作步骤详解:
若在“SQL视图”中输入以下语句:
执行过程中出现错误,如图4-119所示。
图4-119 聚合函数错误
结果分析:Avg([成绩])函数没有数据源,解决方法是先使用子查询求出平均工资。
改进1:
在“SQL视图”中输入以下语句:
运行后的结果如图4-120所示。
图4-120 未显示平均分的查询结果
结果分析:运行结果未显示平均分,原因是系统先执行了子查询,即内查询语句“Select Avg([成绩]) From 成绩表”作为了条件,在显示字段中并未列出来,所以需要继续改进。
改进2:要显示平均分,将完整的内查询添加到Select语句中。(www.xing528.com)
在“SQL视图”中输入以下语句:
运行后的结果如图4-121所示。
图4-121 显示平均分
结果分析:从图4-121可知,平均分存在小数位。
改进3:将平均分小数位数设置为0,用Round函数对结果进行改进。Round函数的格式为Round(X,n),其中X为输出的值,n是需要保留的小数位数。为了与后续做比较,添加姓名排序字段,用Order By完成字段排序。
在“SQL视图”中输入以下语句:
运行结果如图4-122所示。
图4-122 大于平均分的学生信息
结果分析:由图4-122可知,查询结果显示了所有大于平均分的各科成绩,即像图4-122中同一位学生可能出现多次,原因是该位同学选了多门课程,目前各位同学的各科成绩均显示出来了。若要显示学生所有科目平均值大于平均分的,还需要改进。
改进4:应用Group By 子句对学生进行分组,同时显示学生的平均分,学生平均分保留1位小数。
在“SQL视图”中输入以下语句:
运行结果如图4-123所示。
图4-123 高于平均分的学生
保存查询为“例4-40高于平均分的学生信息”。
例4-41 查找教授或副教授带的课程的课程编号,显示“课程编号”,查询保存为“例4-41 SQL教授/副教授带的课程”。
操作步骤:
(1)打开“教学信息管理”数据库,打开查询设计视图,切换到SQL视图。
(2)在SQL视图中输入如下语句:
(3)单击“运行”按钮,查看结果如图4-124所示。
图4-124 教授/副教授带的部分课程
(4)保存查询为“例4-41 SQL教授/副教授带的课程”。
思考:创建一个查询,将此例题中的重复项消除。
注:在创建各查询时,可利用视图之间的切换来完成,一般SQL视图与设计视图相结合。
如例4-41中,可结合设计视图在设计视图中进行如下设计,如图4-125所示。
图4-125 教授/副教授带的课程
测试运行后,切换到SQL视图即可查看SQL语句。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。