450 likes | 597 Views
第八章 查询和视图. 查询和视图是 Visual Foxpro 实现对 一个 数据表或 多个 相关联的数据表进行数据检索的两个重要工具。 8.1 查询 一、查询的基本概念 查询就是根据用户给定的条件,从指定的一个表或 多个相关联 的表中 获取数据 的一个操作过程。 获取数据: 对数据表进行浏览、筛选、排序、检索、统计,形成 不同 类型的文件,产生结果多样化的数据资源。 多个相关联的表 :表与表之间有公共字段(两表都具有的共同字段)。 建立查询的方法有三种: ◆ 使用 Select-Sql 语句建立查询 ◆ 使用查询设计器建立查询 ◆ 使用查询向导建立查询.
E N D
查询和视图是Visual Foxpro实现对一个数据表或多个相关联的数据表进行数据检索的两个重要工具。 8.1 查询 一、查询的基本概念 查询就是根据用户给定的条件,从指定的一个表或多个相关联的表中获取数据的一个操作过程。 获取数据:对数据表进行浏览、筛选、排序、检索、统计,形成不同类型的文件,产生结果多样化的数据资源。 多个相关联的表:表与表之间有公共字段(两表都具有的共同字段)。 建立查询的方法有三种: ◆使用Select-Sql语句建立查询 ◆使用查询设计器建立查询 ◆使用查询向导建立查询
二、使用Select-Sql语句建立查询 1.Sql结构化查询语言简介 Sgl结构化查询语言(Structured Query Language)是一种适用于数据库管理系统的标准化查询语言。在Vfp数据表管理系统中,嵌入的Sql语言只是Sql结构化查询语言中的一个子集,它可以在Vfp的命令窗口和任何程序中使用。 2.使用Select-Sql语句建立查询 (1)单表的查询 命令格式: Select <选项> [As<列标题>], <选项> [As<列标题>] ,…… From <数据表文件名> [Where<过滤条件> [Distinct]
选项有下述几种表示形式: ◆可以是From <数据表文件>中的字段名或者由字段名、常量、函数、运算符组成的有效表达式。 Avg〈字段名〉:求一列数据的平均值。 Count(*):输出查询的行数(记录的条数)。 Min〈字段名〉:输出列中的最小值。 Max〈字段名〉:输出列中的最大值。 Sum〈字段名〉:输出一列数据的和。 进行各种统计和运算 ◆可以是“*”号,表示选择数据表文件中的所有字段。
◆ [As<列名>]:如果字段名不能完全或准确地表达含义,可用As另起标题名。在显示时,[As<列名>]会代替字段名。 ◆ From <数据表文件>:打开要进行查询的数据表文件,若数据表事先未用Use打开,则数据表文件名应包含完整的路径。 ◆ Where <过滤条件>:与For <条件表达式>相同 过滤条件表达式中的运算符除通常的逻辑运算符:And、Or、Not和比较运算符:>、<、<=、>=、=、<>外。 还可以包含一些关键字,如:Between…And…、In和Like等。 Between…And…:表示在“…和…”之间。 In(表达式1, 表达式2,……):表示满足(表达式1, 表达式2,……)中的任何一个。 Like:字符串匹配运算符,匹配符%表示0到多个字符, 匹配符_表示一个字符。
◆ Distinct:消除重复行。 例:列出学生档案数据表中所有的班级,除去重复的班级。 Select 班级 As 班级名称 From F:\学生档案表 Distinct 例:显示高考成绩表中所有学生的学号,各门课程的高考成绩及总分。 Select 学号,语文 As 语文成绩,数学 as 数学成绩,物理 As 物理成绩, 政治 as 政治成绩,英语 as 英语成绩,化学 as 化学成绩,语文+数学+物理+英语+政治+化学 As 高考总分 From 高考成绩表
例: 统计学生成绩表文件中,课程代码为“1803”的平均成绩,最高成绩,最低成绩。 Select 课程代码,Avg(成绩) As 平均成绩,Max(成绩) As 最高成绩,Min(成绩) As 最低成绩 From 学生成绩表 Where 课程代码="1803“ 例:在“学生档案表”,查询98级并且年龄为18-20的学生的学号,姓名,年龄。 Select 学号,姓名, 年龄 From 学生档案表 Where 学号 Like "98%".And.年龄 Between 18 And 20 例:在“学生档案表”文件中,查询99212或98321班的男学生的情况。 Select * From 学生档案表 Where 性别="男".And.班级 In("98321","99212")
(2)多数据表的查询 在多表中进行数据查询,首要的条件是要将多表建立两两关联。 Sql查询语言中的Where子句不仅可以表述<过滤条件>,而且可以表述<连接条件>。通过<连接条件>就可以把多个数据表进行连接,建立关联,实现查询来自多个数据表的有关数据。 注意:Where子句可以同时表述<过滤条件>和表述<过滤条件>,<过滤条件>与<连接条件>之间必须用.And.连接。如果从三个以上的表中进行数据查询,则必须建立多个<连接条件>。多个<连接条件>之间也必须用.And.连接。
1) 命令格式一 Select <别名.选项1> [As<列名1>] [,<别名.选项2> [As<列名2>]…… From <数据表1> [<别名>] [,<数据表2> [<别名>],…… Where [<过滤条件1>] and/or [<过滤条件2>] ……and [<连接条件1>.And.<连接条件2>……
参数说明: ◆ <别名.选项>:选项的意义与前面相同。 因为是多表查询,所以<选项>前面必须注明<别名>。<别名>可以是<选项>所在的数据表的别名,也可以用工作区号来表示。如果用工作区号来表示,则FROM <数据表>后面必须注明工作区号。 ◆ Where <过滤条件>、 <连接条件>:Where子句具有<过滤条件>和<连接条件>两个功能。 <连接条件>:将若干个数据表,通过两两数据表的公共字段建立关联,实现多表的连接。 ◆ 不论是<过滤条件>,还是<连接条件>中的有关字段都必须注明工作区号或别名。
例:从“学生档案表”、“学生成绩表”、要求显示学号,姓名,课程代码,成绩。例:从“学生档案表”、“学生成绩表”、要求显示学号,姓名,课程代码,成绩。 select 学生档案表.学号,姓名,课程代码,成绩 from 学生档案表,学生成绩表 where 学生档案表.学号=学生成绩表.学号 或 select a.学号,姓名,课程代码,成绩 from 学生档案表 a,学生成绩表 b where a.学号=b.学号
例:从“学生档案表”、“学生成绩表”、“课程代码表”中,查询成绩>=80分各门课程,要求显示学号,姓名,课程名称,成绩。例:从“学生档案表”、“学生成绩表”、“课程代码表”中,查询成绩>=80分各门课程,要求显示学号,姓名,课程名称,成绩。 select a.学号,姓名,课程名称,成绩 from 学生档案表 a,学生成绩表 b,课程代码表 where a.学号=b.学号 and b.课程代码=c.课程代码 and 成绩>80
2)命令格式二 Select [<别名>.] <选项1> [As<列名1>] ,[<别名>.] <选项2> [As<列名2>]…… From <数据表1> Join <数据表2> Join …… On <连接条件1> On <连接条件2>…… Where <过滤条件> 参数说明: ◆ 在这种格式中,JOIN的顺序和ON的顺序是很重要的,尤其要引起注意。相应的连接条件一定要按相反的顺序给出ON的顺序。
例:从“学生档案表”、“学生成绩表”、要求显示学号,姓名,课程代码,成绩。例:从“学生档案表”、“学生成绩表”、要求显示学号,姓名,课程代码,成绩。 select 学生档案表.学号,姓名,课程代码,成绩 from 学生档案表 join 学生成绩表 on 学生档案表.学号=学生成绩表.学号
例:从“学生档案表”、“学生成绩表”、“课程代码表”中,查询各门课程,要求显示学号,姓名,课程名称,成绩。 select 学生档案表.学号,姓名,课程名称,成绩 from 学生档案表join 学生成绩表join 课程代码表on 课程代码表.课程代码=学生成绩表.课程代码 on 学生档案表.学号=学生成绩表.学号 或 select 学生档案表.学号,姓名,课程名称,成绩 from 学生成绩表join 学生档案表on 学生档案表.学号=学生成绩表.学号 join 课程代码表on 课程代码表.课程代码=学生成绩表.课程代码
习题:从学生成绩表、教师代码表、课程代码表中查谒学生的学号,课程名称,教师姓名及成绩习题:从学生成绩表、教师代码表、课程代码表中查谒学生的学号,课程名称,教师姓名及成绩
(4)嵌套查询 当一个Select命令无法完成查询任务时,就可以在Where条件语句的<筛选条件>中嵌入一条Select-From-Where语句来进行查询。嵌入的Select-From-Where查询语句作为Where <筛选条件>的限定条件,实现各种复杂条件的查询。 命令格式: Select <选项> From <数据表文件名> Where<筛选条件> (Select <选项> From <数据表文件名> Where<筛选条件>)
参数说明: ◆ 嵌入Select-From-Where子查询必须用括号( )括起来。子查询的结果必须是一个确定的值。 如果是一个集合,可以在筛选条件表达式中,包含一些关键字。这些关键字有: All:要求子查询中的所有记录都使结果为真时,结果才为真。 Any或Some:在进行比较时,只要求子查询中有一条记录使结果为真,则结果就为真。 Exists或On Exists:是用来检查在子查询中是否有符合Where<筛选条件>的记录,如果存在,则结果就为真。它本身并没有任何运算和比较。
例:查询学生档案表中年龄大于99212班的所有学生的各项信息。例:查询学生档案表中年龄大于99212班的所有学生的各项信息。 Select * From 学生档案表 Where 年龄>All(Select 年龄 From 学生档案表 Where 班级="99212") 或 Select * From 学生档案表 Where 年龄>(Select max(年龄) From 学生档案表 Where 班级="99212") 问:若把该题中的ALL改为ANY,是何意思? 习题:查询选修了课程代码为1802的学生信息。
3.查询结果的处理 查询结果的处理主要包括查询结果的输出、查询结果排序、查询结果分组和筛选等处理。 (1)查询结果的输出 定向输出也是Select命令的一个选项,通过使用定向输出选项,就可以把查询结果以多种形式的文件输出到指定的目标。 1)格式之一 Into <目标> 2)格式之二 To File<文件名>[Additive] [To Print/To Screen]
参数说明: ◆ 输出子句缺省为Query(Browse)方式。 ◆ Into <目标>:目标可以是Dbf <数据表名>、Table <表名>、Cursor<临时表名>、Array<数组名>之一。 其中Dbf <数据表名>和Table <表名>都是表,创建后即被打开。Cursor是临时表,创建后即被打开,但不保存。 ◆ To File<文件名>:可以将查询的结果输出到一个文本文件。 选择[Additive]表示把查询结果追加到文本文件,否则,将覆盖To File <文件名>指定的文本文件中的内容。 ◆ To Print:将查询输出结果送至打印机。 ◆ To Screen:将查询输出结果送至屏幕。
例:从“学生档案表”和“学生成绩表”中,查询课程代码为1802并且成绩小于等于80分的学生的学号,姓名,班级,课程代码,成绩并将结果输出到数据表文件xscj.Dbf中。例:从“学生档案表”和“学生成绩表”中,查询课程代码为1802并且成绩小于等于80分的学生的学号,姓名,班级,课程代码,成绩并将结果输出到数据表文件xscj.Dbf中。 Select A.学号,A.姓名,A.班级,B.课程代码,B.成绩 From 学生档案表 A,学生成绩表 B Where A.学号=B.学号 And B.课程代码="1802".And.B.成绩<80 Into Dbf Xscj Use Xscj Browse
(2)查询结果排序 Select的查询结果是按数据表的自然顺序给出的。因此,查询的结果通常是无序的。 如果需要使查询的结果有序排列,就要在Select命令中使用Order By <排序项目>选项,对查询的结果进行排序。按By<排序项目>指定的字段名和[Asc/Desc] 指定的升降序排列查询结果。 Order By<排序项目> [Asc/Desc] [,<排序项目> [Asc/Desc]...]
参数说明: ◆ By<排序项目>必须是Select<选项>中的字段名或表达式。 ◆ 有多个排序项目时,用逗号“,”分隔。 ◆ 降序用Desc表示,升序Asc表示,是默认值。 例:从“学生档案表” 中,查询学生的学号,姓名,班级,年龄,并按年龄的降序排列输出。 Select 学号,姓名,班级,年龄 From 学生档案表 order by 年龄 desc
(3)查询结果分组和筛选 分组:Group By <分组项> [,<分组项>...] 筛选: Having〈筛选条件> 参数说明: ◆〈分组项〉可以是数据表的字段名或Sql函数表达式。 ◆ Having〈筛选条件>给出筛选的限定条件,且〈筛选条件>必须与Group By <分组项>的字段名或Sql函数表达式一致。 ◆ HAVING的语法与WHERE子句一样,其后跟一个条件表达式。但WHERE是针对单个行而言的,HAVING是针对一组行而言的。HAVING和WHERE的不同之处在于: (1)执行查询时,在按照GROUP BY子句分组之前先去掉不满足WHERE中条件的行,而HAVING子句中的条件在分组之后被应用。 (2)HAVING子句可以在条件中包含聚合函数,但WHERE不行。
例:从学生档案表中,查询各班级的学生数。 Select 班级,Count(班级) As 班级人数 From 学生档案表 Group By 班级 例:从学生成绩表中,查询各门课程的平均分,显示课程代码和平均成绩。 例:从学生档案表中,查询江西籍的学生数 Select 籍贯,Count(籍贯) As 人数 From 学生档案表 Group By 籍贯 Having 籍贯="江西” 例:在学生成绩表中,显示平均成绩>80的课程代码及平均成绩。
三、使用查询设计器建立查询 查询设计器是一种可视化的、完全交互式的建立查询的工具。 使用查询设计器建立查询会自动生成相应的Select-Sql语句。 查询设计器建立查询的操作步骤: ◆打开相应的数据库或数据库表 ◆打开查询设计器、添加表或视图 ◆设计查询、 ◆保存.Qpr查询文件并可选择不同的输出方式形成不同类型的多种文件。
例如: 从“学生档案表”和“学生成绩表”中,查询课程代码为1802并且成绩小于等于80分的学生的学号,姓名,班级,课程代码,成绩,并以成绩的降序排列。
五、 查询文件的使用 查询的结果可以用多种类型的文件形式保存起来。 比如:扩展名为.Qpr的 查询文件、 Dbf <数据表名> 数据表文件 To File <文件名> 文本文件 等。 查询可以产生结果多样化的数据资源,不同类型的文件有不同的使用方法。
1.Qpr查询文件的使用 Qpr查询文件本身并不保存数据,它的数据来源于源数据表。因此,Qpr文件依附于数据表(但是使用时,不需要打开源数据表)。 Qpr的程序文件运行使用后,还会产生一个同名的.Qpx类型的编译文件。 注意:运行.Qpr的程序文件一定要指明文件类型 (1)命令方式 Do <查询文件.Qpr> 如: Do 学生成绩报表.Qpr
(2)菜单方式 单击“程序”、“运行”,在弹出的运行窗口中选择要运行的成绩查询Qpr文件,单击“运行”。 或打开查询文件,在系统菜单上会增加“查询”菜单,选择 “查询”、“运行查询”。 2.DBF数据表的使用 查询形成的数据表文件是一个独立存在的数据表文件。因此,它的使用与数据表文件是一样的。 Use <数据表名> Browse
8-2 视图 一、视图的基本概念 1.视图的类型 视图分为两大类: ◆文件类型为.Vue的关联视图 ◆文件类型为.Dbf的数据库表视图。 数据库表视图又分为 ※本地数据库表视图 ※远程数据库表视图。 关联视图是在多个相关联的自由表或数据库表之间建立的一种关联。表间的关联既可以是一种临时关联,也可以作为视图文件保存,其文件类型是.Vue。 通过这种关联,能够建立表与表之间记录指针的联系,能控制不同工作区中记录指针的联动。因此,能够引用关联表中的任何字段。
数据库表视图是从相关联的数据库表派生出来的“虚表”,其文件类型为.DBF,它独立存储在对应的数据库中。数据库表视图是从相关联的数据库表派生出来的“虚表”,其文件类型为.DBF,它独立存储在对应的数据库中。 数据库表视图,它可以从一个或多个数据库表中提取有用的数据,并使数据暂时从数据表中分离出来,成为自由的数据。 注意:数据库表视图本身实际上并不存储数据,只是存放着描述视图的定义。因此,从逻辑上来讲,数据库表视图是一个定制的虚表,是从属于数据库的。所以,在创建或使用数据库表视图前,必须首先打开对应的数据库文件。 2.建立视图的必要条件 建立视图的必要条件是两个要关联的数据表必须有公共字段,我们把它称为关联字段。因为,在关联时它要求比较两个表文件的关联字段值是否相等。
二、 创建临时关联 1.用命令创建临时关联 (1)确定关联公共字段 根据对数据表结构的分析,确定要关联的数据表是否具有公共字段。如存在则确定之,如不存在则表之间不能建立关联。 (2)选定父表与子表并分析父表与子表的关系类型,VFP能处理的关系类型有一对一、一对多。 注意:如果仅是两表建立关联,原则上父表与子表可以任选。但如果是多个两两表建立关联,则父表必须具有与所有子表建立关联的所有公共字段。
(3)选择不同的工作区分别打开子表并为子表以关联字段为索引关键字建立索引,若已建立,则打开索引。(3)选择不同的工作区分别打开子表并为子表以关联字段为索引关键字建立索引,若已建立,则打开索引。 (4)选择其他工作区打开父表文件,父表文件是当前工作区的当前表。 (5)建立多表关联
例:用关联的方法,将学生档案表和专业代码表建立关联。例:用关联的方法,将学生档案表和专业代码表建立关联。 Close All Select 1 Use 专业代码表 Excl Index On 专业代码 Tag Dm Select 2 Use 学生档案表 Excl Set Relation To 专业代码 Into 专业代码表 additive
1)建立一对一关系的关联 Set Relation To <第一关联字段> Into <第一个子表文件名/工作区号> [,<第二关联字段> Into <第二子表文件名 /工作区号>…] [Additive]] 2)建立一多关系的关联 在数据表中设置一多关系是一个较复杂的问题,如果仅用Set Relation To来关联,就会丢失子表中关联字段值相同的其他记录。 因为检索记录时,在父表中每取一个记录,便在子表中找第一个相备配的记录,形成一个新记录。如果子表中有多个关联字相同记录,则只能取子表中第一个与其相备配的记录,这样就会丢失子表中关联字相同的其他记录。
因此,要建立一多关系的关联,在使用了 Set Relation To <第一关联字段> Into <第一子表文件名/工作区号> [,<第二关联字段> Into <第二子表文件名 /工作区号>…] 后,必须再用 Set Skip To <第一个一多关系的子表名/ 工作区号>, <第二个一多关系的子表名/ 工作区号>…… 来建立一多关联。
例:用关联的方法,以学生档案表为父表,以学生成绩表为子表,建立关联。例:用关联的方法,以学生档案表为父表,以学生成绩表为子表,建立关联。 Close all Select 1 Use 学生成绩表 Excl Index On 学号 To Xh Select 2 Use 学生档案表 Excl Set Relation To 学号 Into 学生成绩表 Additive Browse Fields 学号,班级,姓名,学生成绩表.课程代码,学生成绩表.成绩 Set Skip To 学生成绩表 Browse Fields 学号,班级,姓名,学生成绩表.课程代码,学生成绩表.成绩
2.建立关联视图文件 表之间建立的关联是一种临时关联。但当关闭系统后,这些关联关系就不复存在。如果我们要把这种关联保存,就需要把这种临时关联作为表视图文件保存。 其命令是: Create View <关联视图文件名> 3.关联视图文件的使用 (1)打开关联视图文件 Set View To <关联视图文件名> 视图文件仅仅是多表之间记录指针的逻辑连接,它不是一个表,不能用USE命令来打开。
(2)关联视图文件的访问 Set View To <关联视图文件名> Browse For <条件表达式> Fields <字段名列表> 多个表建立关联后,父文件记录指针的移动,会使子文件的记录指针自动地同步移动到关联字段值与父文件相同的记录上。因此,用户可以访问关联表中的任何字段。 但引用非当前工作区表文件字段必须在字段名前冠以工作区号或别名,它们之间的连接符可以是“.”或“->”。 引用格式为:工作区号.字段名 或别名->字段名。 实际上,打开关联视图文件后,是很难判断哪个表是非当前工作区的表。所以,对Fields <字段名表>中的所有字段一般都注明表别名。而且,如果没有定义别名,一般都把表名作为别名使用。
例8 用关联的方法将学生成绩表、学生档案表、课程代码表建立ST3关联视图文件,要求只显示“99212”班学生的学号,班级,姓名,课程名称,成绩等字段数据。 close all Select 1 Use 学生档案表 Index On 学号 To Xh Select 2 Use 课程代码表 Index On 课程代码 To Kcdm Select 3 Use 学生成绩表 Set Relation To 学号 Into 学生档案表,课程代码 Into 课程代码表 Browse Fields 学生档案表.学号,学生档案表.姓名,学生档案表.班级,课程代码表.课程名称,成绩 For 学生档案表.班级="99212"
Create View St3 &&将临时关联保存为St3视图文件 Close All &&关闭所有的文件 Set View To St3 &&打开St3视图文件 Browse For 课程代码表.课程名称="数据库技术" Fields 学生档案表.学号,学生档案表.姓名,学生档案表.班级,课程代码表.课程名称,成绩 &&可引用关联表的任何字段
2.在数据工作期窗口建立临时关联 数据工作期是用来设置数据工作环境的交互操作窗口,在该窗口也可以建立临时关联。 (1)数据工作期的概念 数据工作期,包含一组工作区,在每一个工作区中都可以打开的表、索引或关系。 使用数据工作期可以打开、显示表或视图,建立多表的临时关联,设置工作区属性。
(2)在数据工作期窗口建立视图的步骤 1)打开数据工作期窗口 单击系统菜单的“窗口”、“数据工作期”选项 在命令窗口通过Set View On打开 2)打开需建立视图的数据表 3)为子表按关联的关键字建立索引或确定主控索引 4)选定父表为当前表,并与子表建立关联 5)字段筛选和数据过滤 6)保存与浏览关联视图文件