第4章 查询与视图.docx
- 文档编号:27135845
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:29
- 大小:35.58KB
第4章 查询与视图.docx
《第4章 查询与视图.docx》由会员分享,可在线阅读,更多相关《第4章 查询与视图.docx(29页珍藏版)》请在冰豆网上搜索。
第4章查询与视图
第4章查询和视图
4.1学习目标
●理解查询、视图的概念和查询的本质。
●掌握用查询设计器设计查询的方法。
●了解交叉表查询的创建方法。
●掌握SELECT-SQL语句的使用。
●了解视图的创建方法和使用。
●了解用视图更新源表数据和创建参数化视图的方法。
●掌握查询和视图的联系与区别。
4.2例题解析
一、选择题解析
1.查询文件中保存的是________。
A.查询的命令B.查询的结果C.查询的条件D.与查询有关的表
【解析】答案为A。
查询与视图的本质都是定义一条SELECT-SQL语句。
由于查询的数据源随时可以变化,检索结果是动态的数据集合,因此查询文件中保存查询的结果意义不大。
2.有关查询与视图,下列说法中不正确的是________。
A.查询是只读型数据,而视图可以更新数据源
B.查询可以更新数据源,视图也有此功能
C.视图具有许多数据库表的属性,利用视图可以创建查询和视图
D.视图可以更新源表中的数据,存储于数据库中
【解析】答案为B。
查询与视图的区别主要有三点:
一是视图是可以更新的,并且可以把更新发送回源表;二是视图是虚表,可以与自由表和数据库表一样作为查询和视图的数据源;三是查询文件的扩展名是.qpr,而视图作为数据库的一部分,保存在数据库文件中。
3.在VisualFoxPro中,建立查询可以________方法。
A.使用查询向导B.使用查询设计器
C.直接使用SELECT-SQL命令D.以上方法均可
【解析】答案为D。
VFP中创建查询可以使用查询向导、查询设计器和SELECT-SQL命令。
但无论是利用查询设计器还是查询向导创建的查询,其实质都是生成对应的SELECT-SQL语句。
因此,一般情况下,可以任意使用一种方法创建查询。
不同的是使用查询设计器或查询向导创建的查询,其对应的SELECT-SQL语句保存为扩展名.QPR的查询文件;另外使用三种方法创建查询,在功能上略有不同,比如不能使用查询设计器和查询向导创建组合查询,而必须使用SELECT-SQL语句。
4.如果要求显示左表的全部记录及右表中满足条件的记录,应选择________类型。
A.内联接B.左联接C.右联接D.完全联接
【解析】答案为B。
当基于2张或2张以上的表进行查询时,常常需要设置表之间的联接关系。
VFP支持四种类型的联接,分别是内联接、左联接、右联接和完全联接,内联接是最普通的联接。
5.SELECT-SQL语句中的WHERE子句,对应关系代数中的________。
A.选择B.投影C.联接D.选择+投影
【解析】答案为A。
SELECT语句能够表达所有的关系代数表达式。
其中SELECT子句完成投影运算,WHERE子句完成选择运算,JOIN…ON…子句完成联接运算等。
6.有关查询设计器,正确的描述是________。
A.“联接”选项卡与SQL语句的GROUPBY短语对应
B.“筛选”选项卡与SQL语句的HAVING短语对应
C.“排序依据”选项卡与SQL语句的ORDERBY短语对应
D.“分组依据”选项卡与SQL语句的JOINON短语对应
【解析】答案为C。
查询设计器各选项卡对应的SQL语句分别为:
字段—SELECT、联接—LEFT/INNER/RIGHT/OUTERJOINON、筛选—WHERE、排序—ORDERBY、分组—GROUPBY(其中的“满足条件”按钮—HAVING)等。
7.读者表(DZ)中记录如下:
Dzbh
Xm
Lx
Xb
Jg
Csrq
王焱
学生
女
江苏南京
1989/09/28
赵晗
学生
女
江苏南京
1990/08/20
陈颋君
学生
男
江苏扬州
1991/12/30
C
王韬
教师
男
江苏扬州
1980/06/06
徐超
学生
男
上海
1990/03/15
B
王洋
教师
女
山东青岛
1978/09/02
A
赵娜
教师
女
上海
1969/01/09
(1)查询男女读者的人数。
SELECTXB,________FROMDZ________
A.COUNT(*)AS人数、GROUPBY1B.SUM(*)AS人数、GROUPBYXB
C.COUNT(*)AS人数、ORDERBY1D.SUM(*)AS人数、ORDERBYXB
【解析】答案为A。
本题主要是区别COUNT()和SUM()函数的不同,一个是计数,就像我们在队列里报数一样,另一个是求和,只能对数值型、货币型等类型数据求和。
另外COUNT()函数参数为*号,表示统计记录个数,就本例而言,使用COUNT(DZBH)、COUNT(XM)等也可,即统计DZBH、XM的个数(重复数据多次计数)。
(2)SELECTJG,LX,COUNT(*)AS人数FROMDZGROUPBYJG,LXORDERBYJG,LX
以上查询的查询结果有________条记录。
A.2B.4C.6D.8
【解析】答案为C。
本例按JG和LX的不同将DZ表中的记录进行分组,共有4种不同的JG,2种不同的LX,按理应分成8组,对应8条记录,但由于JG为山东青岛无学生读者,江苏南京无教师读者,所以查询结果记录数为6条。
(3)不能完成“查询所有江苏籍读者”的选项是________。
A.SELECT*FROMDZWHEREJG="江苏"
B.SELECT*FROMDZWHERELEFT(JG,4)="江苏"
C.SELECT*FROMDZWHEREJGLIKE"江苏*"
D.SELECT*FROMDZHAVINGLEFT(JG,4)="江苏"
【解析】答案为C。
本题筛选条件可以用WHERE实现,也可以用HAVING实现,因此A、B、D都对,C错误是因为筛选条件写法有问题,可以用LIKE条件类型或LIKE函数实现,分别写成WHEREJGLIKE"江苏%"或WHERELIKE("江苏*",JG)。
(4)能完成“查询年纪最大的读者”的选项是________。
A.SELECTXM,MAX(CSRQ)FROMDZ
B.SELECTXM,MIN(CSRQ)FROMDZ
C.SELECTTOP1XM,CSRQFROMDZORDERBY2
D.SELECTTOP1XM,CSRQFROMDZORDERBY2DESC
【解析】答案为C。
选项A、B分别求出最大、最小年龄的读者信息,但由于它们分别把整张表压缩成1条记录,所以显示出的XM并不一定是最大、最小年龄者。
选项D,按CSRQ降序排列的话,排在第一的是最后出生的,即年龄最小的读者。
(5)查询所有读者的籍贯,去掉重复记录。
A.SELECTDISTINCT(JG)FROMDZ
B.SELECTDISTINCTJGFROMDZ
C.SELECTJGFROMDZORDERBY1
D.SELECTJGFROMDZORDERBY1DESC
【解析】答案为B。
本查询的查询结果为1列“JG”,四条记录分别为江苏南京、江苏扬州、山东青岛、上海,是在SELECTJGFROMDZ(查询结果为1列“JG”,七条记录为江苏南京、江苏南京、江苏扬州、江苏扬州、上海、山东青岛、上海)的查询结果基础上去掉了重复记录。
进一步思考:
SELECTDISTINCTLEFT(JG,4)FROMDZ的查询结果?
(6)查询命令SELECTJG,COUNT(*)AS人数FROMdzGROUPBY1ORDERBY2的结果集中包含________条记录,第一条记录的JG是________。
A.3,山东青岛B.4,山东青岛C.3,江苏南京D.4,江苏南京
【解析】答案为B。
本例是按JG分组统计读者人数,并按人数升序排列输出。
共有江苏南京、江苏扬州、上海、山东青岛4组,对应4条记录,由于山东青岛只有1人,其他组都为2人,所以第一条记录的JG为山东青岛。
(7)与查询命令SELECTLX,COUNT(*)AS人数FROMDZWHEREXB="男"GROUPBY1等价的命令是SELECTLX,COUNT(*)AS人数FROMDZ______LX,XB________XB="男"
A.GROUPBY、HAVINGB.ORDERBY、WHERE
C.GROUPBY、WHERED.ORDERBY、HAVING
【解析】答案为A。
本例是查询读者中男学生和男教师的人数。
可以先筛选出(WHERE)所有的男读者,然后再按LX分成学生和教师2组,统计每组的人数;也可以先按LX和XB把读者分成4组,并统计每组的人数,然后筛选出(HAVING)男读者所在的组。
(8)查询所有青年(年龄小于35周岁)读者的信息,查询结果保存为younger.txt文件。
SELECT*FROMDZWHERE(DATE()-CSRQ)/365<=35______
A.TOFILEyoungerB.TOTXTyounger
C.INTOFILEyoungerD.INTOyounger.txt
【解析】答案为A。
在SELECT-SQL中用INTO/TO子句指明查询结果保存/输出到何处。
INTOARRAYa、INTOCURSORaa、INTODBF|TABLEaaa三个子句分别将查询结果保存到数组a、临时表aa、表aaa中;TOFILEb、TOPRINTER、TOSCREEN三个子句分别将查询结果输出到文本文件b、打印机、VFP主窗口。
(9)SELECT*FROMDZWHEREJGIN(SELECTJGFROMDZWHEREXM="赵娜")此查询结果有_______条记录
A.4B.3C.2D.1
【解析】答案为C。
本例是查询与赵娜同JG的读者信息,也包括赵娜本人,所以结果有2条记录。
如果要去掉赵娜的记录,应在筛选条件后面加上:
ANDXM<>"赵娜"。
(10)查询年龄比“王洋”小的所有读者信息:
SELECT*FROMDZWHERE______
A.CSRQ>SELECTCSRQFROMDZWHEREXM="王洋"
B.CSRQ>(SELECTCSRQFROMDZWHEREXM="王洋")
C.CSRQ>SELECTCSRQWHEREXM="王洋"
D.CSRQ>(SELECTCSRQWHEREXM="王洋")
【解析】答案为B。
本例为子查询,首先SQL语句SELECTCSRQFROMDZWHEREXM="王洋"查询到“王洋”的出生日期,然后此查询结果构成主查询的筛选条件。
需要注意的是:
子查询必须是一个完整的查询语句,子查询必须放在一对圆括号内,子查询只能有一列输出。
(11)查询“男读者”和“女读者”占读者总数的比例。
A.SELECTSUM(IIF(XB="男",1,0))/COUNT(*)AS男读者比例,;
SUM(IIF(XB="女",1,0))/COUNT(*)AS女读者比例FROMDZ
B.SELECTCOUNT(IIF(XB="男",1,0))/COUNT(*)AS男读者比例,;
COUNT(IIF(XB="女",1,0))/COUNT(*)AS女读者比例FROMDZ
C.SELECTXB,COUNT(*)/(SELECTCOUNT(*)FROMDZ)AS比例;
FROMDZGROUPBY1
D.SELECTSUM(IIF(XB="男",1,0))/COUNT(*)AS男读者比例,;
SUM(IIF(XB="女",1,0))/COUNT(*)AS女读者比例FROMDZGROUPBYXB
【解析】答案为A。
表达式SUM(IIF(XB="男",1,0))的作用是首先判断表中的每一条记录XB字段是否为“男”,如果是“男”返回值为1,否则返回值为0,然后求和,得到男读者的数量。
而表达式COUNT(IIF(XB="男",1,0))的作用是判断表中的每一条记录XB字段是否为“男”,如果是“男”返回值为1,否则返回值为0,然后计数,不管返回值为1还是0都要算一个,这样得不到男读者的数量,得到的是记录的总数,所以B选项错。
至于C选项使用了子查询,但VFP不支持表达式子查询。
D选项加上了分组依据XB,这样先按XB分成2组,一组男读者、一组女读者,对应查询结果应有2条记录。
对于男读者组记录,因为XB都为男,表达式SUM(IIF(XB="男",1,0))/COUNT(*)的返回值为1,而表达式SUM(IIF(XB="女",1,0))/COUNT(*)的返回值为0;同样对于女读者组记录,因为XB都为女,表达式SUM(IIF(XB="男",1,0))/COUNT(*)的返回值为0,表达式SUM(IIF(XB="女",1,0))/COUNT(*)的返回值为1,D选项的查询结果如图4-1所示。
图4-1读者比例D选项查询结果
二、填空题解析
1.利用查询设计器创建的查询,其查询结果输出去向的默认类型是____________,如果要求查询结果为屏幕,可以点击查询工具栏的____________按钮,在“查询去向”对话框中完成。
【解析】答案为浏览窗口、查询去向。
在没有选择查询结果的输出类型时,系统默认将查询结果输出到浏览窗口中。
也可以根据需要,将查询结果输出到不同的目的地:
独立的表文件、临时表、屏幕、报表等。
2.运行查询文件Query1的命令是____________。
【解析】答案为DOQuery1.qpr。
在VFP中,DO命令的功能很多,如在第5章将学到程序,运行程序的命令是DO程序文件名,所以运行查询要加查询文件的扩展名(.QPR),以区分运行程序。
后面我们还会学到运行表单、菜单等,要注意区分不同。
3.____________是数据库的一个组成部分,是一种以用户模式观察数据库中数据的重要机制。
【解析】答案为视图。
视图可由基本表或其他视图导出,它与基本表不同,视图只是一个虚表,在数据字典中保留其逻辑定义,而不作为一个表实际存储数据。
4.已知CJ表结构及记录如下:
XH(C(5))KCDH(C
(2))CJ(N(3))
000010167
000010278
000020156
000020396
000030245
以下查询全部在查询设计器中完成,请填空。
(1)查询成绩(CJ)不及格(低于60分)和成绩在90分以上的学生的学号和课程代号。
此查询选定表为CJ,选定字段为XH和KCDH,同时必须设置____________条件,对应的表达式为:
____________。
【解析】答案为筛选、cj<60ORcj>90。
通过设置筛选条件,可以对数据源中的记录进行筛选,即定义记录子集。
本例筛选条件的逻辑关系是OR而不是AND,因为结果集中任一记录的成绩,或者小于60或者大于90,而不是既小于60又大于90。
(2)如果查询的筛选条件为:
KCDH="01"ANDCJ>=60,满足条件的记录有_____条;如果查询的筛选条件为:
KCDH="01"ORCJ>=60,满足条件的记录有_____条。
【解析】答案为1、4。
前一筛选条件,要求结果集中的记录同时满足KCDH为“01”并且成绩大于等于60,因此满足条件的记录只有1条。
后一筛选条件,要求结果集中的记录或者满足KCDH为“01”或者满足成绩大于等于60,满足条件的记录4条。
(3)查询每门课的选课情况,要求先按课程代号(KCDH)排序,同一课程再按学号(XH)排序输出。
此查询在“排序依据”选项卡,应按先后次序依次添加________和________字段,查询结果有________条记录。
【解析】答案为KCDH、XH、5。
排序对查询结果没有影响,只是决定了查询结果中记录的次序。
本查询的结果如下:
XHKCDHCJ
000010167
000020156
000010278
000030245
000020396
(4)查询每个学生的总分。
此查询的选定字段为XH和________,其分组依据为________,其查询结果有________条记录。
【解析】答案为SUM(CJ)AS总分、XH、3。
分组依据是为了实现“分组查询”,即根据一个字段或多个字段对数据源中的记录进行分组,每组记录进行统计计算。
这里说的“一个字段或多个字段”就是分组依据,分组后,一组记录对应查询结果的一条记录。
本例按XH对CJ表的5条记录进行分组,一共分成3组,因此查询结果有3条记录。
本查询的结果如下:
XH总分
00001145
00002152
0000345
(5)查询总分在140以上的学生学号和总分。
此查询的筛选条件“总分在140以上”应在________选项卡中完成,其查询结果有________条记录。
【解析】答案为分组依据、2。
查询设计器中能实现筛选功能的选项卡有“筛选”和“分组依据”(其中的“满足条件”按钮),区别:
前者是对原始记录进行筛选,后者是对查询结果进行筛选。
本例可理解为查询每个学生的总分,并输出总分在140以上学生的学号和总分,每个学生总分的查询结果如上题,得到这个查询结果后,再筛选出总分大于140的记录。
因此,此筛选条件应在“分组依据”选项卡的“满足条件”中完成,最后的查询结果中包含2条记录,即XH、CJ为“00001、145”和“00002、152”两条记录。
(6)查询每个学生的学号和总分,要求:
如果某门课程的成绩不及格,则该门课程成绩以0分计(即不计入总分),并且只输出总分在140以上的学生。
此查询中要求“如果某门课程的成绩不及格,则该门课程成绩以0分计(即不计入总分)”应在________选项卡中完成,其查询结果有________条记录。
【解析】答案为筛选、1。
上面已经分析过“总分在140以上”是一筛选条件,应在“分组依据”选项卡的“满足条件”中完成。
而某门课程的成绩不及格,则该门课程成绩以0分计,这项要求也应是一筛选条件,应该是将成绩不及格的记录筛选掉,然后按XH分组,求出每组的总分,得到如下查询结果(中间结果),对查询结果再进行筛选“总分在140以上”,得到最终的查询结果(即XH、CJ为“00001、145”的记录)。
所以本例中要求应在“筛选”选项卡中完成,筛选条件为CJ>60,查询结果只有1条记录。
XH总分
00001145
0000296
0000345
(7)查询CJ表中的课程代号,要求去掉重复记录。
完成此查询中的要求“去掉重复记录”,应该在________选项卡中的“无重复记录”复选框中打钩(√),其查询结果有________条记录。
【解析】答案为杂项、3。
“杂项”选项卡可以完成“无重复记录”和列在前面的N条记录、列在前面的N%条记录等功能。
本例查询结果包含KCDH为01、02、03三条记录。
5.设某图书资料室的“图书管理”数据库中有3张表:
ts.dbf(图书表),dz.dbf(读者表)与jy.dbf(借阅表),表结构如下:
ts.dbf
dz.dbf
jy.dbf
字段名
字段类型
字段名
字段类型
字段名
字段类型
编号
C(10)
借书证号
C(6)
借书证号
C(6)
分类号
C(10)
单位
C(18)
编号
C(10)
书名
C(8)
姓名
C(8)
借书日期
D(8)
出版单位
C(20)
性别
C
(2)
还书日期
D(8)
作者
C(8)
类型
C(10)
单价
N(7,2)
系名
C(20)
藏书册数
N(4)
(1)查询读者“王洋”的借书情况。
SELECTjy.*FROM___________ONdz.借书证号=jy.借书证号WHERE姓名="王洋"
或者SELECTjy.*FROM;
WHEREdz.借书证号=jy.借书证号姓名="王洋"
【解析】答案为dzINNERJOINjy、dz,jy、AND。
本例是内联接的两种写法,即联接条件分别用ON或WHERE给出,注意在采用后一种方法时,如果查询本身还有筛选条件,则联接条件和筛选条件之间应采用“交”运算(AND),就像本例。
(2)查询读者“王洋”所借图书的编号、书名和借书日期。
SELECT,书名,借书日期;
FROMdz___________ON___________ON___________WHERE姓名="王洋"
【解析】答案为ts.编号、INNERJOINjyINNERJOINts、ts.编号=jy.编号、dz.借书证号=jy.借书证号。
本例是3张表进行联接,要注意纽带表(jy)要写在中间,写联接条件时要采用逆序,即先写后2张表(ts、jy)的联接条件,再写前2张表(dz、jy)的联接条件。
另外在写2张表都有的公共字段时,表名前缀不能省略,当然对于内联接,用哪一个表的表名做前缀都是一样的。
(3)查询从未借阅图书的读者的借书证号、姓名、类别和系名。
SELECTdz.借书证号,姓名,类别,系名;
FROMdz___________jyON___________HAVING____________________
或者用子查询:
SELECT借书证号,姓名,类别,系名FROMdzWHERE_____________
【解析】答案为LEFTJOIN、dz.借书证号=jy.借书证号、jy.借书证号isnull、借书证号NOTIN(SELECTDISTINCT借书证号FROMjy)。
本例可以用左联接或子查询完成。
用左联接完成的过程是这样的:
首先将DZ表和JY表左联接,得到包括借阅过图书的读者记录、和未借阅过图书的读者记录,然后筛选出所有未借阅过图书的读者记录,所以用HAVING筛选而不用WHERE筛选。
(4)下列SQL命令用来统计教师、学生借书过期罚款人次和罚款金额。
其中罚款金额的算法如下:
对于学生类读者,借阅期限为30天,每超过一天,罚款金额以每本书每天0.05元计算;对于教师类读者,借阅期限为60天,每超过一天,罚款金额以每本书每天0.05元计算。
SELECT类型,COUNT(*)AS罚款人次,______________________AS罚款金额;
FROMjyINNERJOINdzONjy.借书证号=dz.借书证号;
WHEREdz.类型="教师"AND还书日期-借书日期>60;
___________;
SELECT类型,COUNT(*)AS罚款人次,______________________AS罚款金额;
FROMjyINNERJOINdzONjy.借书证号=dz.借书证号;
WHEREdz.类型="学生"AND还书日期-借书日期>30
【解析】答案为SUM(0.05*(还书日期-借书日期-60))、UNION、SUM(0.05*(还书日期-借书日期-30))。
这是一个组合查
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 查询与视图 查询 视图
![提示](https://static.bdocx.com/images/bang_tan.gif)