• 沒有找到結果。

习题 3 参考解答

2.4 查询和视图

2.4.1 复习提要与学习指导

1.掌握查询/视图设计器的使用,理解查询和视图字段、筛选、排序、分组的含义并掌 握其设置方法。

添加表:添加多张表时,注意添加的次序,主表——子表——主表(如果是数据库表,

则事先应打开该表所属的数据库)。

可添加的数据源表:自由表、数据库表、视图(注意:不能为查询)。

字段:设定输出字段

字段表达式 AS 字段标题 或 字符常量 AS 字段标题

如果是字符常量,则表示该字段全部填充该常量的值。例如,"优秀" AS 等级 字段表达式:销售数量*零售价 AS 销售总额

统计函数的使用:

计数:COUNT(*),参数可以为星号或者任意输出字段名。

求和:SUM(),参数可以是一个或多个数值型字段的表达式。

求平均值:AVG(),参数同 SUM()。

求最大值:MAX()。

求最小值:MIN()。

注意

输出字段中如果有统计函数,则一般有分组依据,按分组依据形成多条 记录;如不设定分组依据,则整个表将合并成一条记录。

108 Visual FoxPro 程序设计实训与考试指导(第二版)

可以用星号表示输出表中所有字段。例如:

Select * From stud!xs Where xb="男"

连接条件:

基于单张表的查询不需要考虑连接条件:

FROM stud!xs INNER JOIN stud!cj;

INNER JOIN stud!kc ; ON Cj.kcdh = Kc.kcdh ;

ON Xs.xh = Cj.xh; 注意:表和连接条件之间的对应关系

筛选(Where):直接从表中选出满足条件的记录;有时还可用来建立表之间的连接。

条件类型:

LIKE:表示以什么开头或结尾 js.gh LIKE a

LEFT(CSTR,N):从 CSTR 变量的左边开始取 N 个字符。

RIGHT(CSTR,N):从 CSTR 变量的右边开始取 N 个字符。

SUBSTR(CSTR,NSTART,NLEN):从 CSTR 变量的 NSTART 开始取 NLEN 个字符。

BETWEEN:表示在什么和什么之间。

CSRQ BETWEEN 01/01/81,12/31/82

也可以用逻辑运算符连接两个关系表达式来实现。例如:

CSRQ>={01/01/80} .AND. CSRQ<={12/31/82}

IN:表示在某个范围之内。

函数 inlist(变量,值的列表)

例如:inlist(len(alltrim(xs.xh)),6,8,10):学号字段的长度只能为 6、8、10。

SELECT * FROM xs WHERE xs.xh IN(SELECT DISTINCT cj.xh FROM cj):输出在成绩 表中有成绩的学生的信息。

MODI COMM CHAXUN1.QPR

实例文本框中应注意:①字符串不需加引号,除非和字段名同名;②日期不需加花括 号,但日期的格式必须满足 Visual FoxPro 系统的日期格式(月/日/年);③逻辑值必须按标 准形式(.T.,.F.);④不能用 M 或 G 型字段做选定条件;⑤不等于的表示:实际是相等情况 的取反(选定条件前面的“否”按钮)。

排序(ORDER BY):默认是按升序。注意字段列表的先后顺序影响排序结果,按多个 字段排序,不能用表达式,只需要将字段按次序列出,中间用逗号分隔,而且必须给出每个 字段的顺序(ASCE(升序,可省略)、DESC(降序))。

例如:按性别降序排序,性别相同按姓名升序排序。

例如,ORDER BY xb DESC,xm:如果姓名按降序,则也必须给定 DESC,不能省略。

分组(GROUP BY):分组依据。肯定是输出字段,但不能是通过计算得到的数值输出 字段。

不能使用的:SUM(CJ.CJ)、COUNT(*);可以使用的:LEFT(XH,2)。

分组依据可以是一个字段,也可以是多个字段。

满足条件(HAVING):表示在查询结果的基础上进行的再次筛选,表达式中的字段不 是表中的原始字段。

例如:输出平均分在 75 分以上的学生名单

与筛选条件(WHERE)的区别:WHERE 表示可直接利用表中的字段或经过函数简单 处理来形成的条件。

杂项(TOP N PERCENT;DISTINCT):查询结果的范围。

例如:查询输出总分的前 3 名:

首先 结果按总分的降序排序,然后设置 取前 3 条记录(TOP 3)

DISTINCT:表示忽略查询结果中的重复记录,重复记录只显示第一条 运行查询:查询文件中保存的是查询的命令

DO 查询文件名.QPR (扩展名不能省略)

选择查询的输出类型(INTO | TO):

默认的输出类型:浏览窗口

其他形式:INTO 自由表 TABLE、临时表 CURSOR、数组 ARRAY

(输出的字段数以及记录数决定数组的形状)

TO 报表 REPROT、标签 LABEL、屏幕 SCREEN、打印机 PRINT 2.掌握 SQL 语句尤其是 SELECT-SQL 语句的使用。

SELECT DISTINCT TOP N (PERCENT)输出字段列表(注意 * 的作用)

FROM 数据源表 1 [INNER JOIN 数据源表 2 ON 连接条件]

[WHERE 筛选条件 (注意:多个条件表达式需用逻辑运算符连接)]

[GROUP BY 分组依据]

[HAVING 满足条件]

UNION

SELECT DISTINCT TOP N (PERCENT)输出字段列表 (注意:必须与前一查询的输出 列表一致)

FROM 数据源表 1 INNER JOIN 数据源表 2 ON 联接条件 WHERE 筛选条件

GROUP BY 分组依据 HAVING 满足条件

[ORDER BY 排序依据] (注意:依据可以是字段名或字段序号;它是对查询的最终结 果进行排序)

最后的 ORDER BY 对上两个查询的结果都有效。

学习时,注意把查询/视图设计器与 SELECT-SQL 命令相比较:设计器中的每一个设置 都是与 SELECT 命令中的子句或选项一一对应的。在使用设计器创建、修改查询和视图时,

可以通过菜单或工具栏立即查看 SQL 命令,通过比较,既有利于命令的记忆,又有利于对 设计器中操作的理解。

3.掌握用视图设计器设计本地视图的方法。

视图的分类:本地视图、远程视图。

创建视图的命令:CREATE SQL VIEW 视图名 AS SELECT 语句 注意 视图不以文件的形式保存,而是保存于数据库文件中。

110 Visual FoxPro 程序设计实训与考试指导(第二版)

更新条件:(视图设计器区别于查询设计器的地方)。

设置关键字段:每个需修改数据的表中都必须设定;如果表中没有设置关键字段,则表 中的数据不允许修改及更新;关键字段设置的目的是为了防止更新冲突及出现重复记录

选定需要修改的字段:

使表可更新:选定发送 SQL 更新(SENDUPDATE);它是决定视图中修改的数据是否 反映到基表中去的一个开关。

参数化视图:实际上是筛选条件不确定的一种视图 需要注意条件实例的表示:?参数名

设置视图参数:实际上是确定视图参数的类型。

视图的使用:注意视图的打开与查询的打开不同。

视图是一张虚表,它的打开方式同表:USE 视图名

(注意:视图打开前,必须打开它所属的数据库)

视图的修改和重命名:MODIFY VIEW 视图名 (此命令将打开视图设计器)

视图字段属性的设置:视图的输出字段 可以设置类似于数据库表的扩展属性 可在字段选项卡中,点击属性按钮;(注意:查询设计器不具有该按钮)

4.掌握查询和视图的概念、区别与联系。

查询 视图(本地)

联系 都是检索数据的方法。查询是检查存储在表中的特定信息的一种结构化方法,视图是特殊的查

询;本质上都是 SELECT-SQL 命令;具有相同的数据源类型和输出类型,查询和视图设计器也基 本相同

存储 SELECT-SQL 命令存储为 QPR 查询文件 SELECT-SQL 命令存储在数据库中

处理结果 查询结果为只读的数据 可以更新查询结果中的基表记录数据

用 DO 命令运行 可以当作表用 USE 命令打开

区别

使用 单独作为组合框、列表框的一种数据行源

类型(RowsourceType):“查询”

作为作为组合框、列表框的一种数据行 源时,与表一样为“别名”类型 有关数据库、表、视图、查询的关系结构见下图。

视图 3

库表 1 库表 2 库表 3

查询 1 查询 2 查询 3 查询 4

自由表 2 自由表 1

基表 视图 查询

自由表 3 视图 1 视图 2

2.4.2 习题四及参考解答

一、选择题

1.查询结果可进行( )。

A.数据修改 B.数据追加 C.单独保存 D.保存在数据库中 2.视图( )。

A.可更新数据 B.能单独保存

C.不能修改 D.不能单独保存,也不能修改 3.查询的数据源( )。

A.只能是自由表 B.只能是关联的多表 C.只能是视图 D.表和视图

4.视图是一个( )。

A.虚拟的表 B.真实的表 C.不依赖数据库的表 D.不能修改的表 5.在 Visual FoxPro 中,建立查询可用( )方法。

A.使用查询向导 B.使用查询设计器 C.直接使用 SELECT-SQL 命令 D.以上方法均可 6.关于查询的去向,以下说法不正确的是( )。

A.可输出到浏览窗口 B.可输出到一临时表 C.可输出到一报表文件 D.只可输出到屏幕 7.关于视图,下列说法错误的是( )。

A.对视图的使用与表一样,也可以进行插入、查询、删除、修改操作 B.视图与查询一样,都以文件的形式独立存在,都可以为数据库所管理 C.视图与表不一样,它是一种虚表,不存储数据

D.在 Visual FoxPro 中,可建立本地视图和远程视图

8.使用 SELECT-SQL 命令建立查询时,若要将查询结果输出到一临时数据表中,需要 使用( )子句。

A.INTO ARRAY B.INTO CURSOR C.INTO TABLE D.TO FILE

9.SQL 语句中删除表的命令是( )。

A.DROP TABLE B.DELETE TABLE C.ERASE TABLE D.DELETE DBF 10.UPDATE_SQL 语句的功能是( )。

A.数据定义 B.数据查询 C.修改表的列属性 D.修改表的列内容 11.SQL 语句中修改表结构的命令是( )。

112 Visual FoxPro 程序设计实训与考试指导(第二版)

A.UPDATE STRUCTURE B.MODIFY STRUCTURE C.ALTER TABLE D.ALTER STRUCTURE 12.SQL 语句的核心是( )。

A.数据查询 B.数据修改 C.数据定义 D.数据控制

13.在 SQL 语句中,与表达式“cj BETWEEN 80 AND 90”功能相同的表达式是

( )。

A.cj>=80 AND cj<=90 B.cj>80 AND cj<90 C.cj>=80 AND cj<90 D.cj>=80 OR cj=<90 14.用于显示部分查询结果的 TOP 短语,必须与( )同时使用。

A.GROUP BY B.OEDER BY C.WHERE D.INTO TABLE 15.在 SQL 语句中,与表达式“kcdm NOT IN([005],[008])”等义的表达式是( )。

A.kcdm="005" AND kcdm="008" B.kcdm!="005" AND kcdm!="008"

C.kcdm="005" OR kcdm="008" D.kcdm!="005" OR kcdm!="008"

16.使用 SQL 语句在表 xsda 中查询姓“马”的同学,正确的命令是( )。 A.SELECT * FROM xsda WHERE xm LIKE "马_"

B.SELECT * FROM xsda WHERE xm LIKE "马%"

C.SELECT * FROM xsda WHERE xm="马*"

D.SELECT * FROM xsda WHERE xm="马?"

17.使用 SQL 语句在表 xscj 中增加一条记录,xh 为“1234”,kcdm 为“999”,cj 为 88,正确的命令是( )。

A.INSERT INTO TABLE xscj VALUES("1234","999",88) B.INSERT INTO xscj VALUES("1234","999",88)

C.INSERT INTO xscj(xh,kcdm,cj) VALUES("1234","999",88) D.INSERT INTO xscj VALUES(xh="1234",kcdm="999",cj=88)

18.使用 SQL 语句将上题增加记录的分数调整为 90,正确的命令是( )。 A.UPDATE TABLE xscj SET cj=90

B.UPDATE xscj SET cj=90

C.UPDATE xscj SET cj=90 WHERE xh="1234"

D.UPDATE TABLE xscj SET cj=90 WHERE xh="1234"

19.使用 SQL 语句将上题增加的记录逻辑删除,正确的命令是( )。 A.DROP TABLE xscj

B.DELETE TABLE xscj WHERE xh="1234"

C.DELETE FROM xscj WHERE xh="1234"

D.DROP FROM xscj WHERE xh="1234"

20.根据 xsda 和 xscj 表,找出所有选修了课程号为“009”的学生,正确的命令是

( )。

A.SELECT * FROM xsda,xscj WHERE xsda.xh=xscj.xh AND kcdm="009"

B.SELECT * FROM xsda WHERE xsda.xh=xscj.xh AND kcdm="009"

C.SELECT * FROM xsda INNER JOIN xscj WHERE xsda.xh=xscj.xh AND kcdm="009"

D.SELECT * FROM xsda JOIN xscj WHERE xsda.xh=xscj.xh AND kcdm="009"

21.根据 xsda 表,找出和 xh 为“921608”在同一个专业的学生,正确的命令是

( )。

A.SELECT * FROM xsda WHERE zy=(SELECT * FROM xsda WHERE xh="921608") B.SELECT * FROM xsda WHERE zy=(SELECT zy FROM xsda WHERE xh="921608") C.SELECT * FROM xsda WHERE xh="921608"

D.SELECT zy FROM xsda WHERE xh="921608"

22.根据 xsda 和 xscj 表,找出有满分的学生的专业,正确的命令是( )。

A.SELECT zy FROM xsda WHERE xh IN ANY(SELECT xh FROM xscj WHERE cj=100)

B.SELECT UNIQUE zy FROM xsda WHERE xh=ALL(SELECT xh FROM xscj WHERE cj=100)

C.SELECT zy FROM xsda WHERE xh=ANY(SELECT xh FROM xscj WHERE cj=100)

C.SELECT zy FROM xsda WHERE xh=ANY(SELECT xh FROM xscj WHERE cj=100)

相關文件