Visual FoxPro第3章数据库与表的创建及使用.ppt
l数据库概述l数据库的创建和使用l表的创建和使用l永久性关系与参照完整性第3章 数据库与表的创建及使用3.1 数据库概述3.1.1 数据库的设计过程第第1步:步:确定建立数据库的目的,这有助于确定需要确定建立数据库的目的,这有助于确定需要VFP保存哪些信息;保存哪些信息;第第2步:步:确定需要的表;确定需要的表;在明确了建立数据库的目的之后,就可以着手把信息分成独立的主题,例在明确了建立数据库的目的之后,就可以着手把信息分成独立的主题,例如如“Student”(学生情况)或学生情况)或“Grade”(学生成绩)等。每个主题都可学生成绩)等。每个主题都可以是数据库中的一个表。以是数据库中的一个表。第第3步:步:确定所需字段;确定所需字段;确定在每个表中保存哪些信息。在表中,每类信息称为一个字段,浏览表确定在每个表中保存哪些信息。在表中,每类信息称为一个字段,浏览表时在表中显示为一列。例如,在时在表中显示为一列。例如,在Student表中,可以有这样的字段:表中,可以有这样的字段:“学号学号”、“姓名姓名”、“性别性别”等。等。第第4步:步:确定关系;确定关系;分析每个表,确定一个表中的数据和其它表中的数据有何关系。必要时,分析每个表,确定一个表中的数据和其它表中的数据有何关系。必要时,可以在表中加入字段或创建一个新表来明确关系。可以在表中加入字段或创建一个新表来明确关系。第第5步:步:设计求精。对设计进一步分析,查找其中的错误。创建表时,在设计求精。对设计进一步分析,查找其中的错误。创建表时,在表中加入几个示例记录,看能否从表中得到所想要的结果。表中加入几个示例记录,看能否从表中得到所想要的结果。1.分析数据需求l首先列出需数据库回答的问题清单。如:本学期每个人每首先列出需数据库回答的问题清单。如:本学期每个人每门课的期末考试成绩是多少?有哪些人的哪些课程不及格门课的期末考试成绩是多少?有哪些人的哪些课程不及格?哪些学生的学业成绩达到了获奖学金的标准?哪些学生?哪些学生的学业成绩达到了获奖学金的标准?哪些学生在考试中哪门课程舞弊了?等等。在考试中哪门课程舞弊了?等等。l其次收集所有的表单和报表。这些表单和报表包含了应该其次收集所有的表单和报表。这些表单和报表包含了应该由数据库提供的各种信息。如期末考试成绩需要录入哪些由数据库提供的各种信息。如期末考试成绩需要录入哪些信息等。信息等。l最后,期末考试成绩册如何打印等等。最后,期末考试成绩册如何打印等等。2.确定需要的表确定数据库表是数据库设计过程中技巧性最强的一步。确定数据库表是数据库设计过程中技巧性最强的一步。应注意以下几个方面的问题:应注意以下几个方面的问题:一个表只保存一个主题的内容;一个表只保存一个主题的内容;同一信息只保存一次,这将减少出错的可能性;同一信息只保存一次,这将减少出错的可能性;防止删除有用信息。防止删除有用信息。以建立以建立Gxglxt数据库中的表为例:数据库中的表为例:在学习成绩表中,每位学生所学的课程不属于一位学生,因而需要有一在学习成绩表中,每位学生所学的课程不属于一位学生,因而需要有一个学习课程表。同样,一个班级不只一名学生,要有一个班级主题的表个学习课程表。同样,一个班级不只一名学生,要有一个班级主题的表等。等。Student表和表和Grade表都与学生有关,但关于学生个人情况的信息保存在表都与学生有关,但关于学生个人情况的信息保存在Student表中,表中,Grade表中只保存与成绩有关的信息。表中只保存与成绩有关的信息。当一个班的学生毕业后,可能要删除这个班级,但不能删除这个专业,当一个班的学生毕业后,可能要删除这个班级,但不能删除这个专业,最好的方法是建立一个最好的方法是建立一个“专业(专业(Specialty)”表。表。3.确定表的字段确定表字段的几点技巧:确定表字段的几点技巧:每个字段直接和表的主题相关每个字段直接和表的主题相关;不要包含可推导得到或通过计算可以得到的字段不要包含可推导得到或通过计算可以得到的字段;收集所需的全部信息收集所需的全部信息;以最小的逻辑单位存储信息。以最小的逻辑单位存储信息。使用主关键字段使用主关键字段 VFP不允许在主关键字中有重复值或不允许在主关键字中有重复值或null值。因此,不能选择包含有值。因此,不能选择包含有这类值的字段作为主关键字。这类值的字段作为主关键字。因为要用主关键字的值来查找记录,所以它不能太长,以方便记忆因为要用主关键字的值来查找记录,所以它不能太长,以方便记忆和键入。主关键字可由一定长度的字母和数字组成,或是某一范围内和键入。主关键字可由一定长度的字母和数字组成,或是某一范围内的值。的值。主关键字的长度直接影响数据库的操作速度,因此,在创建主关键主关键字的长度直接影响数据库的操作速度,因此,在创建主关键字时,该字段值最好使用能满足存储要求的最小长度。字时,该字段值最好使用能满足存储要求的最小长度。4.确定表之间的关系 表之间有三种关系:即表之间有三种关系:即一对一关系、一对多关系和多对多关系一对一关系、一对多关系和多对多关系 在一对一关系在一对一关系 在实际应用中不常见,因为两个表之间如果是在实际应用中不常见,因为两个表之间如果是“一对一一对一”关系,则通常可以将他们合并成一个表。关系,则通常可以将他们合并成一个表。在一对多关系中要建立这样的关系,就要把关系中在一对多关系中要建立这样的关系,就要把关系中“一方一方”的主关键的主关键字字段添加到字字段添加到“多方多方”的表中。在关系中,的表中。在关系中,“一方一方”用主关键字或候用主关键字或候选索引关键字,而选索引关键字,而“多方多方”使用普通索引关键字。使用普通索引关键字。在多对多关系中向在多对多关系中向VFP正确指定关系之前,需要改变数据库的设计,正确指定关系之前,需要改变数据库的设计,即创建第三个表,把多对多关系分解为二个一对多关系。这第三个表即创建第三个表,把多对多关系分解为二个一对多关系。这第三个表称作称作“纽带表纽带表”,纽带表可能只包含这两个表的主关键字,也可能包,纽带表可能只包含这两个表的主关键字,也可能包含其它信息。含其它信息。5.设计的优化对所设计的表分析,查找是否存在如下问题:对所设计的表分析,查找是否存在如下问题:表中是否带有大量的并不属于这个主题的字段?表中是否带有大量的并不属于这个主题的字段?表中是否有些字段由于对很多记录不适用而始终保持空白?表中是否有些字段由于对很多记录不适用而始终保持空白?是否有大量的表包含了同样的字段?是否有大量的表包含了同样的字段?是否遗忘了字段?是否有需要的信息没包括进去?如果有,是否遗忘了字段?是否有需要的信息没包括进去?如果有,它们是否属于已创建的表?如果不包含在已创建的表中,那就它们是否属于已创建的表?如果不包含在已创建的表中,那就需要另外创建一个表。需要另外创建一个表。是否为每个表选择了合适的主关键字?在使用这个主关键字是否为每个表选择了合适的主关键字?在使用这个主关键字查找具体记录时,它是否很容易记忆和键入?查找具体记录时,它是否很容易记忆和键入?是否有字段很多、记录却很少的表,而且许多记录中的字段是否有字段很多、记录却很少的表,而且许多记录中的字段值为空?值为空?查找到存在的问题后,就要修改表的结构,以改进设计方案。查找到存在的问题后,就要修改表的结构,以改进设计方案。3.1.2 数据库的组成 从项目管理器窗口中可以看出从项目管理器窗口中可以看出VFPVFP数据库包含数据库包含5 5个项个项目:表、本地视图、连接和存储过程。目:表、本地视图、连接和存储过程。1.表(Table)表式存放数据的容器,而数据库又是表的容器,表式存放数据的容器,而数据库又是表的容器,VFPVFP中表可以分为:中表可以分为:数据库表数据库表和和自由表。自由表。表与数据库之间的相关性是通过表文件和库文件表与数据库之间的相关性是通过表文件和库文件之间的双向链表实现的。之间的双向链表实现的。数据库文件数据库文件前链前链前链前链后链表文件后链表文件后链表文件后链表文件2.视图 所谓所谓视图视图是由一个或多个表组合成的一个是由一个或多个表组合成的一个“虚表虚表”,VFPVFP中的视图分为中的视图分为本地视图本地视图和和远程视图远程视图。特点:特点:(1 1)使用查询语句从一个或多个表中获得数据,与查询相似)使用查询语句从一个或多个表中获得数据,与查询相似(2 2)虽然是虚表,但可以对其内容进行更行。)虽然是虚表,但可以对其内容进行更行。l连接 连接是保存在数据库中的一个定义,指定了数据源连接是保存在数据库中的一个定义,指定了数据源的名称,用于连接远程数据库,来创建远程视图。的名称,用于连接远程数据库,来创建远程视图。l存储过程 存储过程是在数据库数据上执行特定操作并存储在存储过程是在数据库数据上执行特定操作并存储在数据库文件中的程序代码,并在打开数据库时加载数据库文件中的程序代码,并在打开数据库时加载到内存中。到内存中。3.1.3 数据字典 数据字典是指存储在数据库中用于描述所管理的表和对象数据字典是指存储在数据库中用于描述所管理的表和对象的数据,即描述数据的数据,称之为的数据,即描述数据的数据,称之为“元数据元数据”。VFP中,每一个数据库都带有一个数据字典,其数据存放中,每一个数据库都带有一个数据字典,其数据存放在数据库文件中,可用于创建和制定以下内容:在数据库文件中,可用于创建和制定以下内容:(1)表中的字段的标题、注释、默认值、输入掩码和显示格)表中的字段的标题、注释、默认值、输入掩码和显示格式等。式等。(2)表的索引关键字)表的索引关键字 (3)长表名和表注释)长表名和表注释 (4)字段级和记录级有效性规则)字段级和记录级有效性规则 (5)存储过程)存储过程 (6)插入、更新和删除事件的触发器)插入、更新和删除事件的触发器3.2 数据库的创建、打开和使用3.2.1 数据库的创建 VFPVFP中为数据库设计提供了两个工具:中为数据库设计提供了两个工具:数据库向导数据库向导和和数据库设计数据库设计器器。1.1.界面操作创建数据库界面操作创建数据库文件新建2.命令方式创建数据库 格式:格式:CREATE DATABASE CREATE DATABASE|?|?功能:创建由数据库名指定的数据库,若选?或不功能:创建由数据库名指定的数据库,若选?或不带任何参数,执行此命令时打开创建对话框,然后带任何参数,执行此命令时打开创建对话框,然后输入数据库名输入数据库名 VFPVFP中每创建一个新的数据库都将在磁盘上保存中每创建一个新的数据库都将在磁盘上保存三个文件:数据库文件三个文件:数据库文件(.DBC)(.DBC)、关联的数据库备注、关联的数据库备注文件文件(.DCT)(.DCT)和数据库索引文件和数据库索引文件(.DCX)(.DCX)。3.2.2 数据的打开和关闭(1)用界面打开数据库(2)用命令打开数据库格式:OPEN DATABASE|?EXCLUSIVE|SHAREDNOUPDATEVALIDATE功能:打开由数据库名指定的数据库说明:说明:1 1)EXCLUSIVEEXCLUSIVE以独占方式打开数据库,所谓独占方式以独占方式打开数据库,所谓独占方式是指在同一时刻不允许其他用户使用数据库是指在同一时刻不允许其他用户使用数据库2 2)SHAREDSHARED以共享方式打开数据库,所谓共享方式是以共享方式打开数据库,所谓共享方式是指在同一时刻允许其他用户使用数据库指在同一时刻允许其他用户使用数据库3 3)NOUPDATENOUPDATE以只读方式打开数据库。选此子句不能以只读方式打开数据库。选此子句不能对数据库作任何修改,但不影响对表的存取,若让对数据库作任何修改,但不影响对表的存取,若让数据库表也为只读,在用数据库表也为只读,在用USEUSE打开表时加打开表时加NOUPDATENOUPDATE参数参数4 4)VALIDATEVALIDATE是检验数据库中的引用对象是否有效,是检验数据库中的引用对象是否有效,如检查数据库表和索引是否可用,被引用的字段和如检查数据库表和索引是否可用,被引用的字段和索引表是否存在表和索引中索引表是否存在表和索引中 可以同时打开多个数据库,但只有一个是当前数据库,默认为最后一个打开的数据库,可以使用命令:set database to 来制定当前数据库3.关闭数据库格式:CLOSE DATABASE ALL功能:关闭当前数据库,及所有表。若选ALL子句,关闭所有打开的数据库和表关闭指定的数据库 set database to jxsj close database4.删除数据库格式:DELETE DATABASE|?DELETE TABLES RECYCLE功能:删除由数据库名指定的数据库,从磁盘上删除数据库,要求数据库必须是关闭状态说明:1)选DELETE TABLES子句是在删除数据库同时也从磁盘上将数据库表删除2)选RECYCLE子句是将删除的数据库与表放入回收站中3.3 表的创建与使用3.3.1 表结构概述 在在VFPVFP中,建立表的步骤是中,建立表的步骤是:(1):(1)先设计表的结构,先设计表的结构,保存。保存。(2)(2)再向表中添加数据再向表中添加数据 表结构:表的字段、数据类型、宽度表结构:表的字段、数据类型、宽度(最大字节数最大字节数)等。等。空值:用来指示记录中的一个字段空值:用来指示记录中的一个字段”有或没有有或没有”的的数据标识。数据标识。3.3.2 利用表设计器创建表 VFPVFP中创建表后,系统以扩展名中创建表后,系统以扩展名.DBF.DBF保存表文件。保存表文件。如果表中有备注型字段或通用型字段,则自动产生如果表中有备注型字段或通用型字段,则自动产生一个与表同名但扩展名为一个与表同名但扩展名为.FPT.FPT的备注文件。的备注文件。1.1.利用表设计器创建表结构利用表设计器创建表结构 第一步第一步 创建一个项目创建一个项目 第二步第二步 在项目管理器中创建的自由表在项目管理器中创建的自由表 第三步第三步 为表中添加记录为表中添加记录 2.2.创建数据库表及修改表的结构创建数据库表及修改表的结构3.3.3 字段属性与表属性1.字段的扩展属性 数据库表的每个字段除具有字段名、类型、宽度数据库表的每个字段除具有字段名、类型、宽度等基本属性外,还可以设置标题、注释、格式、等基本属性外,还可以设置标题、注释、格式、输入掩码、默认值等扩展属性。输入掩码、默认值等扩展属性。(1)字段的标题和注释字段的标题和注释 注意:注意:标题只是一些界面中代表字段的标签,在标题只是一些界面中代表字段的标签,在引用字段时引用字段时 必须使用段名,如给必须使用段名,如给xm字段,添加字段,添加标题标题”姓名姓名”,select*from xs where 姓名姓名=张三张三&错的错的 select*from xs where xm=张三张三&正确正确(2)字段的显示属性 字段的显示属性用来指定输入和显示字段时的格字段的显示属性用来指定输入和显示字段时的格式,包括式,包括格式格式和和输入掩码输入掩码。字段的格式字段的格式:用于指定字段显示时的格式,包括:用于指定字段显示时的格式,包括浏览窗口、表单或报表中显示时的大小写和样式。浏览窗口、表单或报表中显示时的大小写和样式。输入掩码输入掩码:用于指定字段中输入数据的格式。:用于指定字段中输入数据的格式。(3)(3)默认值默认值 向表中添加新纪录时,为字段所指定的最初的值称向表中添加新纪录时,为字段所指定的最初的值称为该字段的默认值。为该字段的默认值。如给如给xsxs表中的表中的xbxb字段设置默认值为字段设置默认值为”男男”。(4)字段的有效性规则和有效性信息 字段的有效性规则:字段的有效性规则:用来控制输入到字段中的数据用来控制输入到字段中的数据的取值范围。的取值范围。有效性信息:有效性信息:用于指定在不满足规则要求时所显示用于指定在不满足规则要求时所显示的消息框中的说明信息。的消息框中的说明信息。例如,设置学生表中成绩字段为例如,设置学生表中成绩字段为0100之间,使用逻之间,使用逻辑表达式辑表达式”cj=0.and.Cj“打开”l在数据库工作期窗口中单击“打开”l在项目管理器窗口中选择需要打开的表,然后单击“修改”或“浏览”(2)使用命令打开表在命令窗口中,可以使用USE命令打开一个表。该命令的基本语法格式:USE TableName IN nWorkArea|cTableAlias1 AGAIN ALIAS cTableAlias2 NOUPDATEIN:指定在哪个工作区中打开,缺省在当前工作区中打开AGAIN:用于说明表再次被打开ALIAS:子句用于定义表的别名NOUPADTE:指定表打开后不允许修改结构和数据。例如:USE xs&在当前工作区中打开xs表,别名为xs USE js ALIAS jiaoshi IN 4 USE cj IN 0 NOUPDATE USE xs AGAIN IN 5 USE xs AGAIN IN 15注意:如果以个表同时在多个工作区中开开并且均未指定别名,则在第一次打开的工作区中,别名与表名相同,其他工作区中用AJ以及W11W32747。4.表的关闭如果在以个工作区中已经打开了一个表,则在该工作区中打开另一个表,先前的表自动关闭。(1)通过界面操作:在数据工作期中(2)使用命令 USE IN nWorkArea|cTableAlias 关闭所有打开的表 CLOSE TABLE ALL5.表的独占与共享 在默认状态下,表是以独占方式打开的,可以使用set exclusive 命令来设置:set exclusive off&设置“共享”为默认打开方式 set exclusive on&设置“独占”为默认打开方式 或者在打开表的时候设置 USE xs SHARED USE js EXCLUSE 3.3.5 记录的处理1.记录的输入表记录的输入可以在创建完表结构后进行。(1)表结构创建后立即输入记录(2)在浏览窗口中追加记录l利用菜单“显示”-”浏览”l在“数据工作期”中选择“表”单击浏览l在项目管理器中浏览(3)使用INSERT 命令追加记录该命令的格式为:INSERT INTO TableName(FieldName,FieldName2,)values(eExpresion1,eExpression2,)例如 INSERT INTO xs(xh,xm,xb,xzydm)values(“050503017”,”高山”,”男”,“050301”)(4)APPEND与APPEND FROM命令追加记录 使用APPEND命令可以向表中追加空记录 APPEND BLANK IN nWorkArea|cTableAlias 使用APPEND FROM命令可以将其他文件(表文件、文本文件、Excell文件等)中的数据导入当前工作区的表中。该命令的格式:APPEND FROM FileNameFIELDS FieldListFOR lExpressionDELIMITED|XLSDELIMITED:用于说明追加文件为文本文件XLS:用于说明追加文件为Excel文件缺省时追加文件为表文件(5)备注和通用字段的数据输入“浏览”-“添加新纪录”-“双击”2.浏览窗口 可以使用BROWS命令来浏览表文件。格式:BROWSE FIELDS FiedList FOR lExpressionFREEZE FieldName NOAPPENDNODELETENOMODIFYTITLE cExpressionFIELDS:指定在浏览窗口中出现的字段FOR:用于筛选记录FREEZE:用于指定可以修改的字段NOAPPEND:指定不可以追加记录3.记录的筛选l如果用户只想查看和处理满足一定条件的一部分记录,可以对表记录进行筛选。l(1)通过界面“数据工作期”-“表”-“属性”(2)通过命令SET FILTER命令,该命令的格式为:set filter to lExpression例如,CLOSE TABLE ALL USE xs SET FILTER TO xb=女 BROWSE FIELDS xh,xm NOMODIFY TITLE 女学生4.限制对字段的访问 可以通过设置字段筛选来限制对某些字段的访问。格式如下:SET FIELD TO FieldList例如,CLOSE TABLE ALL USE XS SET FIELD TO XH,XM BROWSE FOR XB=女 NOMODIFY TITLE“女学生”5.记录的定位 当一个表被打开后,系统自动地为该表生成三个控当一个表被打开后,系统自动地为该表生成三个控制标志:制标志:记录开始标志记录开始标志、记录指针标志记录指针标志、记录结束记录结束标志标志。记录指针指针相关函数(1)RECNO():返回记录的指针的当前位置(2)BOF():当指针在记录开始标志时返回true(3)EOF():当指针在记录结束标志时返回true表中记录情况 BOF()的值RECNO()的值EOF()的值无记录.T.1.T.有记录.F.1.F.(2)记录的定位 记录的定位,按其方式分可以分为:记录指针的绝对定位、记录指针的相对定位和条件定位采用界面进行记录定位 当表处于浏览状态时,记录的定位可以利用菜单命令“表”-”转到记录”条件定位条件定位 采用命令进行记录定位 绝对定位命令:GOTO 相对定位命令:SKIP 条件定位命令:LOCATE FOR格式:GOTO nRecordNumber IN nWorkArea|IN cTableAlias|TOP|BOTTOM SKIP nRecords IN nWorkArea|cTableAlias LOCATE FOR lExpression Scope注意:如果从第一条记录向上移一条记录,记录指针就指向开始标志。如果从最后一条记录向下移动一条记录,记录指针就指向结束标志。6.记录的修改用户可以通过界面或命令对记录进行修改(1)界面方式通过浏览窗口或编辑窗口通过菜单“表”-”替换字段”可以进行对记录的批量修改(2)使用命令修改记录修改记录字段值的命令有两个:UPDATE-SQL命令和REPLACE命令。区别:REPLACE命令只能修改当前工作区打开的表,而执行UPDATE-SQL命令前不需要打开表格式:UPDATE TableName SET FieldName1=eExpression1,FieldName1=eExpression1,WHERE lExpression REPLACE FieldName1 WITH eExpression1ADDITIVE,FieldName2 WITH eExpression2 ADDITIVEScop FOR lExpression7.记录的删除与恢复 在VFP中,要彻底地删除表中的记录,需要两步:首先标志要删除的记录,然后彻底删除带有删除标记的记录。(1)逻辑删除使用界面删除,点击“记录删除列”,或使用菜单“表”-“删除记录”,打开“删除”对话框,进行条件删除。使用命令DELETE命令或DELETE-SQL命令。格式:DELETE Sope FOR lExpression IN nWorkArea|cTable Alias DELETE-SQL命令:DELETE FROM TableNameWHERE lExpression例子:close tables all use js delete for(year(date()-year(csrq)60下列命令功能同上:delete from js where(year(date()-year(csrq)60(2)恢复带删除标记的记录 恢复带删除标记的记录,即取消记录的删除标记采用界面的方式 在浏览状态下点击删除标记 使用菜单“表”-“恢复记录”打开恢复对话框进行条件恢复。采用命令 RECALL Scope FOR lExpression 如:recall&恢复当前记录 recall all for xb=“男”&恢复所有性别为“男”的记录 recall all&恢复所有记录(3)彻底删除对于在当前工作区打开的表,若记录加注了删除标记,则可以将具有删除标记的记录彻底删除。也成为“物理删除”。使用界面,“表”-“彻底删除”pack使用命令 如:close tables all use xs delete for left(xh,2)=04 pack(4)对带有删除标记的记录的访问可以使用命令SET DELETE命令来制定vfp是否处理带有删除标记的记录。SET DELETE ON|OFF ON忽略标有删除标记的记录,OFF则允许访问标有删除标记的记录。8.数据复制利用COPY TO命令可以将当前工作区中表的数据复制到其他表文件或其他类型的文件中。格式:COPY TO FileNameFIELDS FieldListScopeFOR lExpression1SDF|XLS|DELIMITED WITH Delimiter|BLANK|TABFileName 指定COPY TO要创建的新文件名。FIELDS FieldList 指定要复制到新文件的字段。Scope 指定要复制到新文件的记录范围。FOR lExpression 指定要复制逻辑条件lExpression为.T.的记录到文件中。SDF创建SDF(系统格式)文件。XLS 创建Excel电子表格文件DELIMITED 创建“分隔文件”DELIMITED WITH BLANK 创建用空格代替分隔字符型字段的分隔文件DELIMITED WITH TAB 创建用制表符代替逗号分隔字符型字段的分隔文件例子:close tables all use xscopy to xs01 for xb=女&生成一个xs01.dbf文件,仅包含女学生copy to xs01 FIELDS xh,xm SDF&生成一个xs01.txt文件,仅包含学号和姓名copy to xs01 XLS&生成一个xs01.xls文件3.3.6索引的创建与使用1.索引概述 表中的记录通常是按其输入的时间顺序存放的,这表中的记录通常是按其输入的时间顺序存放的,这种顺序称为记录的种顺序称为记录的物理顺序物理顺序。为了便于查找,通常。为了便于查找,通常将表按照某一个字段排序,这种顺序称为将表按照某一个字段排序,这种顺序称为逻辑顺序逻辑顺序。对有序表进行查找可以使用快速查找方法。对有序表进行查找可以使用快速查找方法。排序有两种方法:一是把表记录按某种逻辑顺序排排序有两种方法:一是把表记录按某种逻辑顺序排序后重新写到一个新的表文件中;序后重新写到一个新的表文件中;记录号 xh xm xb 1 005 吴宏伟 男 2 002 秦卫 女 3 004 孔建 男 4 4 003 王兰 女 记录号 xh xm xb 1 002 吴宏伟 男 2 003 秦卫 女 3 004 孔建 男 4 4 005 王兰 女 对记录进行排序排序前的文件排序后产生的新的文件二是建立一个逻辑顺序号与原表物理顺序的记录号的二是建立一个逻辑顺序号与原表物理顺序的记录号的对照表,并把记录表保存到一个文件中。对照表,并把记录表保存到一个文件中。Index#TableRead#KeyValue1 2 0022 4 003 3 3 004 44 1 005逻辑顺序和物理的顺序的对照表逻辑顺序和物理的顺序的对照表后一种方法称为后一种方法称为索引法索引法。优点:优点:生成对照表的速度快生成对照表的速度快对照表所需的空间小对照表所需的空间小可疑根据表中的多个字段生成多个索引。可疑根据表中的多个字段生成多个索引。2.索引文件类型 VFPVFP中支持三种不同的索引文件:中支持三种不同的索引文件:结构复合索引结构复合索引文件文件、非结构复合索引文件非结构复合索引文件和和独立索引文件。独立索引文件。l结构复合索引文件 结构复合索引文件时将一个表的一个或多个索引的索引结构复合索引文件时将一个表的一个或多个索引的索引信息存储在以一个索引文件中,且索引文件的名称与表信息存储在以一个索引文件中,且索引文件的名称与表名相同,扩展名为名相同,扩展名为.CDX.CDX。l非结构复合索引文件 非结构复合索引文件是将一个表的一个或多个索引的索非结构复合索引文件是将一个表的一个或多个索引的索引信息存储在以一个索引文件中,索引文件的扩展名为引信息存储在以一个索引文件中,索引文件的扩展名为.CDX.CDX,但其文件名与表名不同。,但其文件名与表名不同。l 独立索引文件 独立索引文件是只存储一种索引的索引文件,其扩展名为独立索引文件是只存储一种索引的索引文件,其扩展名为.IDX.IDX,文件名有用户给定。独立索引文件一般作为临时索,文件名有用户给定。独立索引文件一般作为临时索引文件,其特点是查找的速度快。引文件,其特点是查找的速度快。3.使用表设计器创建结构复合索引 (1)(1)排序排序 可以指定索引是升序还是降序可以指定索引是升序还是降序 (2)(2)索引标识索引标识(Tag)(Tag)区别一个表中的多个索引区别一个表中的多个索引 (3)索引类型 在在VFPVFP中,数据库表可以创建中,数据库表可以创建4 4种类型的索引:主索种类型的索引:主索引、候选索引、唯一索引和普通索引。引、候选索引、唯一索引和普通索引。普通索引普通索引 用于决定记录的处理顺序,其索引表达式的值允许用于决定记录的处理顺序,其索引表达式的值允许出现重复。出现重复。唯一索引唯一索引 索引表达式的值可以重复,但在索引文件中重复的值索引表达式的值可以重复,但在索引文件中重复的值只存在一次。只存在一次。候选索引候选索引 候选索引是以表的候选关键字为索引表达式而创建的候选索引是以表的候选关键字为索引表达式而创建的索引,指定的索引表达式的值不可以重复。索引,指定的索引表达式的值不可以重复。l主索引主索引 对于数据库表来说,可以从候选索引中选取一个作为该表对于数据库表来说,可以从候选索引中选取一个作为该表的主索引。每一个数据库表只能有一个主索引。的主索引。每一个数据库表只能有一个主索引。(4)索引表达式索引表达式 索引表达式是建立索引的依据,它通常是一个字段或由多索引表达式是建立索引的依据,它通常是一个字段或由多个字段组成的表达式,个字段组成的表达式,注意注意索引表达式不能基于备注型字索引表达式不能基于备注型字段和通用型字段。段和通用型字段。若索引表达式是基于多个字段的,系统根据若索引表达式是基于多个字段的,系统根据表达式的值进行排序。表达式的值进行排序。如果索引表达式为字符型表达式,则各个字段在索引表达如果索引表达式为字符型表达式,则各个字段在索引表达式中的前后顺序将影响索引的结果。式中的前后顺序将影响索引的结果。如,如,yxzydmyxzydm+xbxb作为索引表达式,则是先按作为索引表达式,则是先按yxzydmyxzydm字段排字段排序,在序,在yxzydmyxzydm字段的值相同的情况下,才按字段的值相同的情况下,才按xbxb字段的值进行排字段的值进行排序。序。l如果索引表达式为算术表达式,则按表达式的运算结果进行排序。如,索引表达式kss+xf,kss和xf都为值类型,则按照他们的和为依据进行排序。l不同的数据类型的字段构成一个索引表达式时,必须转换为同一数据类型(通常转换为字符型),如,在教师表中,要求先按xb字段排序,xb相同则按pyrq字段进行排序,则应该使用索引表达式“xb+DTOC(pyrq,1)”4.索引的使用(1)设置主控索引 一个表可以有多个索引,在使用索引时必须显式一个表可以有多个索引,在使用索引时必须显式的制定某个索引为的制定某个索引为“主控索引主控索引”。在使用在使用USEUSE命令打开表时,可通过命令打开表时,可通过ORDERORDER子句指定主控索子句指定主控索引。如,引。如,USE USE xsxs ORDER ORDER xhxh&主控索引为主控索引为xhxh USE USE xsxs IN 0 ALIAS xs2 AGAIN ORDER IN 0 ALIAS xs2 AGAIN ORDER xbxb&主控索引为主控索引为xbxb 使用界面设置主控索引 如果表处于浏览状态,则通过菜单“表”-“属性”,打开“工作区属性”对话框,然后在“索引顺序”下拉列表框中选择一个索引作为主控索引。如果表没有处于浏览状态,则在“数据工作期”窗口中选择要设置的表,点击属性。如果表已经打开,也可以使用SET ORDER命令设置表的主控索引。该命令的基本语法格式为:SET ORDER TO TagNameIN nWorkArea|cTableAlias ASCENDING|DESCENDING TagName:用于指定主控索引 ASCENDING:为升序排序 DESCENDING:为降序排序(2)利用索引快速定位记录 表建立了索引后,可以基于索引关键字使用SEEK命令进行记录的快速定位,用于搜索表达式值首次出现的记录。格式如下:SEEK eExpressionORDER TagNameASCENDING|DESCENDING IN nWorkArea|cTableAlias注意:SEEK命令只能在索引过的表中使用只能基于索引关键字进行搜索例如,USE xs ORDER xh SEEK “040701004”如果如果SEEKSEEK函数找到与索引关键字相匹配的关键字,函数找到与索引关键字相匹配的关键字,则则RECNO()RECNO()返回匹配记录的记录号,返回匹配记录的记录号,FOUND()FOUND()函数返函数返回回.T.T.,EOF()EOF()函数返回函数返回.F.F.,否则,否则RECNO()RECNO()将返回表将返回表中记录的个数加中记录的个数加1 1,FOUND()FOUND()返回返回.F.F.,EOF()EOF()返回返回T T。3.3.7 自由表 所谓自由表,就是不属于任何数据库的表。所谓自由表,就是不属于任何数据库的表。自由表没有数据库表具有的扩展属性,如:自由表没有数据库表具有的扩展属性,如:显示格式、输入掩码、默认值,标题等,也显示格式、输入掩码、默认值,标题等,也不能创建主索引不能创建主索引。3.3.8 利用命令创建和修改表结构1.使用CREATE TABLE-SQL命令创建表结构,创建数据库表时,数据库必须打开,格式为:CREATE TABLE TableName NAME LongTableName FREE(FieldName1 FieldType(nFieldWidth,nPrecision)NULL|NOT NULL 例如,创建学生表结构 create table xs(xh C(12),xm C(8),xb C(2),zydh C(6),xzydm C(4)2.使用ALTER TABLE SQL命令修改表结构 第一种格式:ALTER TABLE TableName1 ADD COLUMN FieldName1 FieldType(nFieldWith,nPrecision)NULL|NOT NULL CHECK lExpression1 ERROR cMessageTex1 DEFAULT eExpression PRIMARY KEY|UNIQUE例如,ALTER TABLE js ADD COLUMN Fax C(20)NULL&增加一个fax字段 类型为字符型,长度为20 ALTER TABLE js ADD PRIMARY KEY jybh tag jybh第二种格式:ALTER TABLE TableName1 ALTER COLUMN FieldName2 null|not null SET DEFAULT eExpression2 SET CHECK lExpression2 ERROR cMessageText2 DROP DEFAULT DROP CHECK例如,ALTER TABLE js ALTER COLU