Transcript 在表设计器中建立索引
非计算机应用专业教材 浙江广播电视大学 李明 科学出版社 学习目标 理解索引的概念和类型; 理解查询的概念及使用; 理解视图的概念及使用; 掌握索引的创建; 掌握数据完整性的概念及其相关的操作。 目录 5.1 索 引 5.2 查 询 5.3 视 图 5.1 索 引 5.1.1 索引的概念 索引是进行快速显示、快速查询数据的重要手段。 表一旦按索引表达式建立索引后,就会产生一个 相应的索引文件。一旦表和相关的索引文件被打开, 并对表操作时,记录的顺序则按索引表达式值的逻辑 顺序显示和操作。通常可以为一个表建立多个索引, 每一个索引确定了表记录的一种逻辑顺序。 5.1.2 索引类型 可以在表设计器中定义索引,Visual FoxPro中的索 引分为主索引、候选索引、唯一索引和普通索引四种。 1.主索引 在指定字段或表达式中不允许出现重复值的索引, 建立主索引的字段可以看作是主关键字,一个表只能有 一个主关键字,所以一个表只能创建一个主索引。 2.候选索引 候选索引和主索引具有相同的特性,建立候选索引的字段 可以看作是候选关键字,所以一个表可以建立多个候选索引。 3.唯一索引 保持同早期版本的兼容性,“唯一性”是指索引项的唯一, 而不是字段值的唯一。在一个表中可以建立多个唯一索引。 4.普通索引 普通索引也可以决定记录的处理顺序,它不仅允许字段中 出现重复值,并且索引项中也允许出现重复值。在一个表中可 以建立多个普通索引。 5.1.3 创建索引 两种方法:在表设计器中建立索引和用命令建立索引。 1.在表设计器中建立索引 (1)单项索引 在表设计器界面中有“字段”、“索引”和“表”3 个选项卡,在“字段”选项卡中定义字段时就可以直接 指定某些字段是否为索引项,用鼠标单击定义索引的下 拉列表框可以看到有3个选项:无、升序和降序(默认是 无)。如果选定了升序或降序,则在对应的字段上建立 了一个普通索引,索引名与字段名同名,索引表达式就 是对应的字段。 如果要将索引定义为其他类型的索引,则须将界面 切换到“索引”选项卡,然后从“类型”下拉列表框中 选择索引的类型,如图5.1所示。这时可以根据需要选择 主索引、候选索引、唯一索引或普通索引。 (2)复合字段索引 在多个字段上的索引,方法是: 1)在图5.1所示的“索引”选项卡界面上用鼠标左键单击“插入” 命令按钮,这时会在界面出现一新行。 2)在索引名栏目中输入索引名。 3)从索引类型下拉列表框选择索引类型。 4)单击表达式栏右侧的按钮打开表达式生成器,如图5.2所示。 5)在表达式生成器中输入索引表达式,最后单击“确定”按钮。 4)单击表达式栏右侧的按钮打开表达式生成器,如图5.2所示。 5)在表达式生成器中输入索引表达式,最后单击“确定”按钮。 在一个表上可以建立多个普通索引、多个唯一 索引、多个候选索引,但只能建立一个主索引。 通常,主索引用于主关键字字段;候选索引用 于那些不作为主关键字,但字段值又必须唯一的字 段;普通索引用于一般地提高查询速度;唯一索引 用于一些特殊的程序设计。 2.用命令建立索引 命令格式: INDEX ON eExpression TO IDXFileName︱TAG TagName[OF CDXFileName] [FOR lExpression][CINOACT] [ASCENDING︱DESCENDING] [UNIQUE︱CANDIDATE] [ADDITIVE] eExpression : 索引表达式。 TO IDXFileName 建立一个单独的索引文件,扩展名为.idx的文件 TAG TagName中的TagName给出索引名。并具有.cdx扩展名。 OF:则可以用CDXFileName指定包含多个复合索引文件名,扩展名也是.cdx。 FOR lexpression给出索引过滤条件. COMPACT当使用TO IDXFileName时,说明建立一个压缩的.Idx文件。 ASCENDING或DESCENDING说明建立升序或降序索引,默认升序。 UNIQUE说明建立唯一索引。 CANDIDATE与建立索引本身无关,说明现在建立索引时是否关闭以前的索 引,默认是关闭已经使用的索引,使新建立的索引成为当前索引。 另外注意,从索引的组织方式来讲共有3类索引: 1)单独的.idx索引,是一种非结构单索引。 2)采用非默认名的.cdx索引,也是非结构复合索引。 3)与表名同名的.cdx索引,是结构复合索引。 结构复合压缩索引文件具有如下特性: 1)在打开表时自动打开; 2)在同一索引文件中能包含多个索引方案,或 索引关键字; 3)在添加、更改或删除记录时自动维护索引。 在SQL中的建立和取消命令。 (1)建立索引 命令格式:CREATE [UNIQUE] INDEX 〈索引文 件名〉ON 〈基本表名〉(索引关键字 ASC | DESC) 命令功能:根据基本表名建立索引文件。 命令说明:[UNIQUE] 是可选择项,表示每一个索引 关键字的值只对应唯一的元组。 ASC——升序,DESC——降序 例5.1 为“学生表”建立一个按学号升序的索引,名为 SNO-STUDENT。 CREATE INDEX SNO-STUDENT ON学生(学号ASC); (2)取消索引 命令格式:DROP INDEX〈索引文件名〉 命令功能:取消索引文件。 命令举例: 例5.2 取消索引文件SNO-STUDENT DROP INDEX SNO-STUDENT 5.1.4 使用索引 1.打开索引文件 与表名相同的结构索引在打开表时都能够 自动打开,但是对于非结构索引必须在使用之 前打开索引文件。 命令格式: SET INDEX TO IndexFileList 2.设置当前索引 在使用某个特定索引项进行查询或需要记录按某个特定索引项的 顺序显示时,则必须SET ORDER命令指定当前索引项。 命令格式: SET ORDER TO[nIndexNumber|[TAG]TagName] [ASCENDING|DESCENDING] 命令说明: 索引序号(nIndexNumber)或索引名(TagName)指定索引项。 索引序号是指建立索引的先后顺序号,并且按照在SET INDEX TO IndexFileList命令中的总序号排列,特别不容易记清,建议使 用索引号。 命令举例: 例5.3 将结构索引文件中的“学号”没置 为当前索引。 SET ORDER TO TAG 学号 3.使用索引快速定位 用SEEK命令定位.SEEK是利用索引快速定位的命令。 命令格式: SEEK expression[ORDER nIndexNumber/[TAG]TagName] [ASCENDING/DESCENDING] 例5.4 假设当前正在使用学生表,将记录指针定位在学号为 9921105的记录上。 SEEK '9921105‘ ORDER 学号 4.删除索引 删除索引的办法是在表设计器中使用“索 引”选项卡选择并删除索引,使用命令删除结 构索引的格式是: 命令格式: DELETE TAG TagName 5.1.5 实体完整性与主关键字 数据完整性一般包括实体完整性、域完整性和参照完整性. 实体完整性:记录唯一的特性,不允许有重复记录。 如果一个字段的值或几个字段的值能够唯一标识表中的一条 记录,则这样的字段称为候选关键字。在一个表上可能会有 几个具有这种特性的字段或字段的组合,这时从中选择一个 作为主关键字。 在Visual FoxPro中将主关键字称作主索引,将候选关键字称 作候选索引。由上所述,在Visual Foxpro中主索引和候选索 引有相同的作用。 5.1.6 域完整性与约束规则 建立字段有效性规则比较简单直接的方法是在 表设计器中建立,在表设计器的“字段”选项卡中 有一组定义字段有效性规则的项目,它们是“规则” (字段有效性规则)、“信息”(违背字段有效性 规则时的提示信息)、“默认值”(字段的默认值) 3项。具体操作步骤如下: 1)首先选择要定义字段有效性规则的字段。 2)然后分别输入和编辑规则,信息及默认值等项目。 例5.5 某学生选课表中成绩属性有效性规则在0~ 100元之间,当输入的成绩不在此范围时给出出错信 息,职工的默认成绩值是0。 在“规则”框中(或表达式生成器)输入表达式: 成绩>=0 .AND. 成绩<=3000 在“信息”框中(或表达式生成器)输入表达式: “成绩输入错误,应该在0~100元之间。” 在“默认值”框中(或表达式生成器)输入表达式: 0 5.1.7 参照完整性与表之间的关联 参照完整性与表之间的联系有关,大概含 义是:当插入、删除或修改一个表中的数据时, 通过参照引用相互关联的另一个表中的数据, 来检查对表的数据操作是否正确。 1.建立表之间的联系 在数据库设计表之间的联系时,要在父表中建立 主索引,在子表中建立普通索引,然后通过父表的主 索引和子表的普通索引建立起两个表之间的联系。 为了建立表之间的联系,在学生-选课数据库中 的学生表创建学号为主索引,课程表创建课程号为主 索引,学生选课表创建分别学号和课程号为普通索引。 如图5.3所示的数据库设计器中已经建立好的3个表,在这 3个表中,学生和学生选课有一对多的关系,连接字段是 学号;课程和学生选课也有一对多的关系,连接字段是 课程号。 如果在建立联系时操作有误,随时可以通过编辑修改联系。方法是用 鼠标右键单击要修改的联系,连线变粗,从弹出的快捷菜单中选择“编辑 关系”,打开如图5.5所示的“编辑关系”对话框。注意:前文中已经提到, 在中文Visual FoxPro中将联系称为关系。 在如图5.5所示的“编辑关系对话框”中,通过在下拉列表框中,通过在下 拉列表框中重新选择表或相关表的索引名则可以达到修改联系的目的。 2.设置参照完整性约束 在建立参照完整性之前必须首先清理数据 库,所谓清理数据库是物理删除数据库各个表 中所有带有删除标记的记录。只要数据库设计 器为当前窗口,主菜单栏上就会出现“数据库” 菜单,这时可以在“数据库”菜单下选择“清 理数据库”,该操作与命令PACK DATABASE 功能相同。 在清理完数据库后,用鼠标右键单击表之间的联系并从快捷菜单中选择 “编辑参照完整性”,打开的参照完整性生成器界面如图5.6所示。 更新规则:当更新父表中的连接字段(主关键字)值 时,如何处理相关的子表中的记录: “级联”:则用新的连接字段自动子表中的相关所 有记录。 “限制”:若子表中有相关的记录,则禁止修改父 表中的连接字段。 “忽略”:则不作参照完整性检查,可以随意更新 父记录的连接字段值。 删除规则:当删除父表中的记录时,如何处理子表 中相关的记录。 “级联”:则自动删除子表中的相关所有记录。 “限制”:若子表中有相关的记录,即删除父表中 的记录。 “忽略”:则不作参照完整性检查,即删除父表的 记录时与子表无关。 插入规则:当插入子表中的记录时,是否进行参照 完整性检查; “限制”:若父表中没有相匹配的连接字段值则禁 止插入子记录。 “忽略”:则不作参照完整性检查,即可以随意插 入子记录。 例5.6 为“学生-成绩”数据库的学生、课程、成 绩3个表设计参照完整性。 1)首先在“学生-成绩”数据库中建立表之间的 联系,如图5.4所示。 2)执行清理数据库操作。 3)将它们的插入规则设定为“限制”,即插入成绩记录 时检查相关的学生和课程是否存在,如果不存在则禁止 插入成绩记录。 4)将它们的删除规则设定为“级联”,即在删除学生记 录和课程记录时,自动删除相关的成绩记录。 5)将它们的更新规则也设定为“级联”,即当修改学生 的学号或课程的课程号,也自动修改相关的成绩记录。 5.2 查 询 5.2.1 创建查询 1.查询的概念 查询是从指定的表或视图中提取满足条件的记录。 查询是以扩展名为.qpr的文件保存在磁盘上的,这是 一个文本文件,它的主体是SQL SELECT语句,另外 还有和输出定向有关的语句。 2.查询设计器 建立查询的方法很多: 1)用CREATE QUERY命令打开查询设计器建立查询。 2) “文件”菜单下的“新建”,或单击“常用”工具栏上的 “新建”按钮,打开“新建”对话框,然后选择“查询”并选 择“新建文件”打开查询设计器建立查询。 3)在项目管理器的“数据”选项卡下选择“查询”,然后单 击“新建”命令按钮打开查询设计器建立查询。 4)如果读者熟悉SQL SELECT,还可以直接编辑qpr文件建 立查询。 单击要选择的表或视图,然后单击“添加”按钮。如果单击“其他” 按钮还可以选择自由表。当选择完表或视图后,单击“关闭”按钮正式进 入如图5.8所示的查询设计器界面。 注意:当一个查询是基于多个表时,这些表之间必须是有联系的。 查询设计器会自动根据联系提取联接条件,否则在打开图5.7所示的查询 设计器之前还会打开一个指定联接条件的对话框,如图5.9所示,由用户 来设计联接条件。 1)前面已经选择了设计查询的表或视图,对应于FROM短语, 此后还可以从“查询”菜单或工具栏中选择“添加表”或选择 “移去表”重新指定设计查询的表。 2)“字段”选项卡对应于SELECT短语,指定所要查询的数据, 这时可以单击“全部添加”选择所有字段,也可以逐个选择字 段“添加”;在“函数和表达式”编辑框中可以输入或编辑计 算表达式。 3)“联接”选项卡对应于JOIN ON短语,用于编辑联接条件。 4)“筛选”选项卡对应于WHERE短语,用于指定查询条件。 5)“排序依据”选项卡对应于ORDER BY 短语,用于指定 排序的字段和排序方式。 6)“分组依据”选项卡对应于GROUP BY 短语和 HAVING 短语,用于分组。 7)“杂项”选项卡可以指定是否要重复记录(DISTINCT) 及列在前面的记录(对应于TOP短语)等。 8)从以上各选项卡的内容可以看出,如果读者熟悉SQL SELECT,那么设计查询是非常简单的;反之,如果读者不 熟悉,甚至不了解SQL SELECT,将很难理解查询设计器中 的这些内容。 例5.7 建立一个含有学号、姓名、课程名和成绩的查询。 只需要在图5.8所示的界面中,从“可用字段”中选择字段,并把它们添加到 “选定字段”中,只要按顺序选择学生表中的学号、姓名字段、课程表中的 课程名字段和学生选课表中的成绩字段,并把它们添加到“选定字段”中, 如图5.10所示。 至此,一个简单的查询就建立好了,此时按Ctrl+Q键、单击工具栏中的运行 按钮或者选择“查询”菜单下的“运行查询”,都可以立刻运行查询并看到 查询结果,如图5.11所示 5.2.2 使用查询 在项目管理中,将“数据”选项卡的查询 项展开,然后选择运行的查询,选择单击“运 行”命令方式执行查询,命令格式是: Do QueryFile 在查询设计器中可以根据需要为查询输出定位查询 去向,选择“查询”菜单下的“查询去向”,或在 “查询设计器”工具栏中单击“查询去向”按钮, 此时将打开一个“查询去向”对话框,如图5.12所示 这些查询去向的具体含义如下: 浏览:在“浏览”(BROWSE)窗口中显示查询结果(默认 的输出去向)。 临时表:将查询结果存储在一个命名的临时只读表中。 表:将查询结果保存在一个命名的表中。 图形:使查询结果可用于Microsoft Graph(Graph是包含在 Visual FoxPro中的一个独立的应用程序)。 屏幕:在Visual FoxPro主窗口或当活动输出窗口中显示查询 结果。 报表:将查询结果输出到一个报表文件(frx)。 标签:将查询结果输出到一个标签文件(lbx)。 5.3 视 图 视图(view):从一个或几个基本表或其他视图 导出来的表。视图本身并不独立存储数据,系统只保 存视图的定义。访问视图时系统将按照视图的定义从 基本表中存取数据。在数据库三级模式结构中,基本 表属于全局模式中的表,它是实表;而视图是属于局 部模式中的表,视图是个虚表,它动态地反映基本表 中的当前数据 。 可以从本地表、其他视图、存储在服务器上的表 或远程数据源中创建视图,视图又分为本地视图和远 程视图。 使用当前数据库中表建立的视图是本地视图,使 用当前数据库之外的数据源(如SQL Server)中的表 建立的视图是远程视图。 5.3.1 创建视图 可以用“视图设计器”建立视图,同样由于视图的 基础是 SQL SELECT语句,所以只有真正理解了 SQL SELECT才能设计好视图。 1.建立视图的方法 可以使用以下方法建立视图: 1)用CREATE VIEW命令打开视图设计器建立视图。 2)选择“文件”菜单下的“新建”,或单击“常用”工具栏上的“新建” 按钮,打开“新建”对话框,然后选择“视图”并单击“新建文件”按钮 打开视图设计器建立视图,如图5.13所示。 3)在项目管理器的“数据”选项卡下将要建立视图 的数据库分支展开,并选择“本地视图”或“远程视 图”,然后单击“新建”命令按钮打开视图设计器建 立视图。 4)如果熟悉SQL SELECT,还可以直接用建立视图 的SQL命令建立视图。 命令格式: CREATE VIEW 〈视图名〉(〈列名〉,...) AS〈SELECT 子句〉 [WITH CHECK OPTION]; 从多个表派生出的视图 例5.9 从选课表和课程表中建立各系每个学生所 选课程的简单视图,名称为s1。 CREATE VIEW s1(系名,学号,姓名,所选课程) SELECT系名,学号,姓名,课程名, FROM学生,选课,课程 WHERE学生.学号=选课.学号 AND 选课.课程号=课程.课 程号 2.视图设计器 视图设计器和查询设计器的使用方法几乎完全 一样。主要有以下几点不同: 1)查询设计器的结果是将查询以.qpr扩展名的文件 保存在磁盘中;而视图设计完后,在磁盘上找不到 类似的文件,视图的结果保存在数据库中。 2)由于视图是可以用于更新的,为此在视图设计器中 多了一个“更新条件”选项卡,如图5.13所示。 3)在视图设计器中没有“查询去向”的问题。 5.3.2 视图与数据更新 1.指定可更新的表 如果视图是基于多个表的,默认可以更新“全部表”的相关 字段,如果要指定只能更新某个表的数据,则可以通过“表” 下拉列表框选择表。 2.指定可更新的字段 在“字段名”列表框中列出了与更新有关的字段,在字段名 左侧有两列标志,“钥匙”表示关键字,“铅笔”表示更新, 通过单击相应列可以改变相关的状态,默认可以更新所有非 关键字字段,并且通过基本表的关键字完成更新, 3.检查更新合法性 如果在一个多用户环境中工作,服务器上的数据 也可以被别的用户访问,也许别的用户也在试图更新 远程服务器上的记录,为了让Visual FoxPro检查用视 图操作的数据在更新之前是否被别的用户修改过,可 使用“SQL WHERE子句包括”框中的选项帮助管理 遇到多用户访问同一数据时应如何更新记录。 单个表派生出的视图。 例5.8 从原学生表中建立电子工程系的学生视图,名 称为ele-student。 CREATE VIEW ele-student AS SELECT学号,姓名,性别,出生日期,系名 FROM 学生 WHERE单位="电子工程系" WITH CHECK OPTION; “SQL WHERE子句包括”框中各选择项的含义如下: 1)关键字段:当基本表中的关键字字段被改变时,更新失败。 2)关键字和可更新字段:当基本表中任何标记为可更新的字段 被改变时,更新失败。 3)关键字和已修改字段:当在视图中改变的任一字段的值在基 本表中已被改变时,更新失败。 4)关键字和时间戳:当远程表上记录的时间戳在首次检索之后 被改变时,更新失败。此项选择仅当远程表的时间戳列时才有 效。 4.使用更新方式 “使用更新”框的选项决定当向基本表发送SQL更新 时的更新方式: 1)SQL DELETE然后INSERT:先用SQL DELETE 命令删除基本表中被更新的旧记录,再用SQL INSERT命令向基本表手稿更新后的新记录。 2)SQL UPDATE:使用 SQL UPDATE命令更新基本 表。 5.3.3 使用视图 视图建立之后,不但可以用它来显示和更新数据,而且还 可以通过调整它的属性来提高性能,视图的使用类似于表。 1.视图操作---允许以下操作: 1)在数据库中使用USE命令打开或关闭视图。 2)在“浏览器”窗口中显示或修改视图中的记录。 3)使用SQL语句操作视图。 4)在文本框、表格控件、表单或报表中使用视图作为数据源等。 2.使用视图 可以在“项目管理器”中“浏览”视图, 也可以通过命令来使用视图。 一个视图在使用时,将作为临时表在自己 的工作区中打开。如果此视图基于本地表,即 来地视图,则在另一个工作区中同时打开基本 表视图的基本表是由定义视图的SQL SELECT 语句访问的。 在项目管理器使用视图的方式是:先选择一 个数据库,接着再选择视图名,然后选择“浏览” 按钮,则在“浏览”窗口中显示视图,并可对视 图进行操作。 对视图的更新是否反映在了基本表里,则取 决于在建立视图时是否在“更新条件”先项卡中 选择了“发送SQL更新”。 本章小结 1.Visual FoxPro索引的概念, 2.表之间联系的表示, 3.实体完整性、域完整性、参照完整性的实现, 4.介绍了检索和操作数据库的两个基本工具或手 段:查询和视图。 。 5.查询和视图基本具有相同的作用。两者之间的 区别是:查询可以定义输出去向,可以将查询的 结果灵活地应用于表单、报表、图形等各种场合, 但是利用查询不可以修改数据; 6.利用视图可以修改数据,可以利用SQL将对视 图的修改发送到基本表,特别是对于远程表的操 作,利用视图是非常有效的 完