Visual FoxPro程序设计:第13章 SQL

上传人:hs****ma 文档编号:571146611 上传时间:2024-08-08 格式:PPT 页数:136 大小:453KB
返回 下载 相关 举报
Visual FoxPro程序设计:第13章 SQL_第1页
第1页 / 共136页
Visual FoxPro程序设计:第13章 SQL_第2页
第2页 / 共136页
Visual FoxPro程序设计:第13章 SQL_第3页
第3页 / 共136页
Visual FoxPro程序设计:第13章 SQL_第4页
第4页 / 共136页
Visual FoxPro程序设计:第13章 SQL_第5页
第5页 / 共136页
点击查看更多>>
资源描述

《Visual FoxPro程序设计:第13章 SQL》由会员分享,可在线阅读,更多相关《Visual FoxPro程序设计:第13章 SQL(136页珍藏版)》请在金锄头文库上搜索。

1、第13章 关系数据库标准语言SQLSQL是Structured Query Language的缩写,即结构化查询语言。它是关系数据库的标准语言。查询是SQL语言的重要组成部分,SQL还包含数据定义、数据操作和数据控制功能等内容。SQL已经成为关系数据库的标准数据语言,所以现在所有的关系数据库管理系统都支持SQL。掌握SQL语法可以更加灵活地建立查询和视图。13.1 SQL简介 SQL语言来源于20世纪70年代IBM的一个被称为SEQUEL(Structured English Query Language)的研究项目。20世纪80年代,SQL由ANSI进行了标准化,它包括了定义和操作数据的指令

2、。由于它具有功能丰富、使用方式灵活、语言简洁易学等突出特点,在计算机界深受广大用户欢迎,许多数据库生产厂家都相继推出各自支持SQL标准。1998年4月,ISO提出了具有完整性特征的SQL,并将其定为国际标准,推荐它为标准关系数据库语言。1990年,我国也颁布了信息处理系统数据库语言SQL,将其定为中国国家标准。13.1.1 SQL语言的主要特点(1)一体化语言。SQL提供了一系列完整的数据定义、数据查询、数据操作和数据控制等方面的功能。用SQL可以实现数据库生命周期中的全部活动,包括简单地定义数据库和表的结构,实现表中数据的录入、修改、删除、查询和维护,数据库重构、数据库安全控制等一系列操作要

3、求。(2)高度非过程化。SQL和其他数据操作语言不同,SQL是一种非过程性语言,它不必一步步地告诉计算机“如何”去做,用户只需说明做什么操作,而不用说明怎样做,不必了解数据存储的格式及SQL命令的内部,就可方便地对关系数据库进行操作。(3)语言简洁。虽然SQL的功能很强大,但语法却很简单,只有为数不多的几条命令。表13.1给出了分类的命令动词,从该表可知,它的词汇很少。初学者经过短期的学习就可以使用SQL进行数据库的存取等操作,因此,易学易用是它的最大特点。(4)统一的语法结构对待不同的工作方式。SQL语言可以直接在VFP的命令窗口以人机交互的方式使用,也可嵌入到程序设计中以程序方式使用,比如

4、,SQL语言写在.PRG文件中也能运行。在书写的时候,如果语句太长,可以用“;”号换行。现在很多数据库应用开发工具都将SQL语言直接融入到自身的语言之中,使用起来更方便,VFP就是如此。这些使用方式为用户提供了灵活的选择余地。此外,尽管SQL的使用方式不同,但SQL语言的语法基本是一致的。13.1.2 SQL语句的执行SQL语句可以在命令窗口中执行,也可以作为查询或视图(的内容)被使用,还可以在程序文件被执行。表13.1 SQL命令动词 SQL功能 命令动词 数据查询 SELECT 数据定义 CREATE、DROP、ALTER 数据操作 INSERT、UPDATE、DELETE 数据控制 GR

5、ANT、REVOKE13.2 查询功能数据库中最常见的操作是数据查询,也是SQL的核心。13.2.1 SQL语法SQL给出了简单而又丰富的查询语句形式,SQL的查询命令也称作SELECT命令,它的基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。格式: SELECT ALL|DISTINCT TOP表达式 别名 Select表达式 AS 列名 , 别名 Select表达式 AS 列名 FORM 数据库名 ! 表名 ASLocal_Alias INNER | LEFT OUTER | RIGHT OUTER | FULL OUTER JOIN 数据库名 ! 表名 A

6、SLocal_AliasON联接条件 INTO 查询结果 |TO FILE 文件名 ADDITIVE | TO PRINTER PROMPT | TO SCREEN PREFERENCE PreferenceNameNOCONSOLEPLAINNOWAIT WHERE 联接条件1 AND 联接条件2AND | OR 筛选条件 GROUP BY 组表达式 , 组表达式 HAVING 筛选条件 UNION ALL SELECT命令 ORDER BY 关键字表达式 ASC |DESC , 关键字表达式 ASC |DESC说明:SELECT-SQL命令的格式包括三个基本子句:SELECT子句、FROM

7、子句、WHERE子句,还包括操作子句:ORDER子句、GROUP子句、UNION子句以及其他一些选项。1.SELECT子句SELECT子句用来指定查询结果中的数据。其中:ALL选项:表示选出的记录中包括重复记录,这时缺省值;DISTINCT则表示选出的记录中不包括重复记录。TOP表达式选项:表示在符合条件的记录中,选取指定数量或百分比(表达式)记录。别名Select表达式AS列名选项中的别名是字段所在的表名;Select表达式,可以是字段名或字段表达式;列名用于指定输出时使用的列标题,可以不同于字段名。Select表达式用一个*号来表示时,指定所有的字段。2.FROM子句用于指定查询的表与联接

8、类型。其中:用于指定查询的表与联接类型。其中:JOINJOIN关键字用于联接其左右两个表名所指关键字用于联接其左右两个表名所指定定的表。的表。INNER | LEFTINNER | LEFTOUTEROUTER | | RIGHTRIGHTOUTEROUTER | FULL | FULLOUTEROUTER选项,指定选项,指定两表联接时的联接类型,联接类型有两表联接时的联接类型,联接类型有4 4种,如种,如表表13.213.2所示。其中的所示。其中的OUTEROUTER选项,表示外部联选项,表示外部联接,即允许满足联接条件的记录,又允许不满接,即允许满足联接条件的记录,又允许不满足联接条件的记

9、录。若省略足联接条件的记录。若省略OUTEROUTER选项,效果选项,效果不变。不变。表表13.2 13.2 联接类型联接类型联接类型联接类型 意义意义Inner Join(Inner Join(内部联接内部联接) ) 只有满足联接条件的记录包含在结果中只有满足联接条件的记录包含在结果中Left Outer Join(Left Outer Join(左联接左联接) ) 左表某记录与右表所有记录比较字段值,左表某记录与右表所有记录比较字段值,若有满足联接条件的,则产生一个真实记录;若都有满足,则产生一个若有满足联接条件的,则产生一个真实记录;若都有满足,则产生一个含含. .NULLNULL值的记

10、录。直到右表所有记录都比较完值的记录。直到右表所有记录都比较完Right Outer Join(Right Outer Join(右联接右联接) ) 右表某记录与左表所有记录比较字段值,右表某记录与左表所有记录比较字段值,若有满足联接条件的,则产生一个真实记录;若都不满足,则产生一个若有满足联接条件的,则产生一个真实记录;若都不满足,则产生一个含含. .NULLNULL值的记录。直到右表所有记录都比较完值的记录。直到右表所有记录都比较完FullFull Jion Jion( (完全联接完全联接) ) 先按右联接比较字段值,再按左联接比较先按右联接比较字段值,再按左联接比较字段值。不列入重复记录

11、字段值。不列入重复记录ONON选项:用于指定联接条件。选项:用于指定联接条件。INTOINTO与与TOTO选项:用于指定查询结果的输出去向,默认查询结果显示在浏选项:用于指定查询结果的输出去向,默认查询结果显示在浏览窗口中。览窗口中。INTOINTO选项中的选项中的 查询结果查询结果 有有3 3种,如表种,如表13.313.3所示。所示。13.3 13.3 查询结果查询结果 目标目标 输出形式输出形式 ARRAYARRAY数组数组 查询结果输出到数组查询结果输出到数组 CURSORCURSOR临时表临时表 查询结果输出到临时表查询结果输出到临时表 TABLE | DBFTABLE | DBF表

12、名表名 查询结果输出到表查询结果输出到表TO FILETO FILE选项:选项:表示输出到指定的文本文件,并取代原文件内容。表示输出到指定的文本文件,并取代原文件内容。ADDITIVEADDITIVE选项:表示只添加新数据,不清除原文件的内容。选项:表示只添加新数据,不清除原文件的内容。TO PRINTERTO PRINTER选项:表示输出到打印机。选项:表示输出到打印机。PROMPTPROMPT选项:表示打印前先显示打印确认框。选项:表示打印前先显示打印确认框。TO SCREENTO SCREEN选项:表示输出到屏幕。选项:表示输出到屏幕。PLAINPLAIN选项:表示输出时省略字段名。选项

13、:表示输出时省略字段名。NOWAITNOWAIT选项:表示显示浏览窗口后程序继续往下执行。选项:表示显示浏览窗口后程序继续往下执行。3.3.WHEREWHERE子句子句用来指定查询的条件。其中的用来指定查询的条件。其中的 联接条联接条件件 指定一个字段,该字段连接指定一个字段,该字段连接FROMFROM子子句中的表。句中的表。如果查询中包含不止一个表,就应该为如果查询中包含不止一个表,就应该为第一个表后的每一个表指定连接条件。第一个表后的每一个表指定连接条件。4.4.其他子句和选项其他子句和选项GROUP BYGROUP BY子句:对记录按组表达式值分组,常用于分组统计。子句:对记录按组表达式

14、值分组,常用于分组统计。HAVINGHAVING子句:当含有子句:当含有GROUP BYGROUP BY子句时,子句时,HAVINGHAVING子句可用作记录查子句可用作记录查询的限制条件;无询的限制条件;无GROUP BY GROUP BY 子句时,子句时,HAVINGHAVING子句的作用如同子句的作用如同WHEREWHERE子句。子句。UNIONUNION子句:可以用子句:可以用UNIONUNION子句嵌入另一个子句嵌入另一个SELECT-SQLSELECT-SQL命令,使这命令,使这两个命令的查询结果合并输,但输出字段的类型和宽度必须一致两个命令的查询结果合并输,但输出字段的类型和宽度

15、必须一致。UNIONUNION子句默认组合结果中排除重复行,使用子句默认组合结果中排除重复行,使用ALLALL,则允许包含重则允许包含重复行。复行。ORDER BYORDER BY子句:指定查询结查中记录按关键字表达式排序,子句:指定查询结查中记录按关键字表达式排序,默认升序。选项默认升序。选项ASCASC表示升序表示升序,DESEDESE表示降序。表示降序。SELECTSELECT查询命令的使用非常灵活,用它可以构造各种各样的查询。查询命令的使用非常灵活,用它可以构造各种各样的查询。本章将通过大量的实例来介绍本章将通过大量的实例来介绍SELECTSELECT命令的使用方法。命令的使用方法。1

16、3.2.2 13.2.2 简单查询简单查询简单查询只含有基本子句,可有简单的简单查询只含有基本子句,可有简单的查询条件。查询条件。【13.113.1】在】在zgdazgda表中,检索所有字段。表中,检索所有字段。 SELECT * FROMSELECT * FROM zgda zgda13.2.2 13.2.2 简单查询简单查询【13.213.2】在】在zggzzggz表中,检索实发工资大表中,检索实发工资大于于20002000元的记录。元的记录。 SELECT SELECT 编号编号, ,姓名姓名, ,实发工资实发工资 FROMFROM zggz zggz WHERE WHERE 实发工资实

17、发工资2000200013.2.2 13.2.2 简单查询简单查询【1313.3.3】在】在zgdazgda表中,检索所有职称名表中,检索所有职称名称。称。 SELECT DISTINCT SELECT DISTINCT 职称职称 FROMFROM zgda zgda【13.413.4】在在zgdazgda表中,检索职称是助教表中,检索职称是助教的记录。的记录。 SELECT SELECT 编号编号, ,姓名姓名, ,职称职称 FROMFROM zgda zgda WHERE WHERE 职称职称=助教助教 13.2.2 13.2.2 简单查询简单查询【1313.5.5】在】在zggzzggz

18、表中,检索实发工资小表中,检索实发工资小于于10001000大于大于18001800元的记录。命令执行结元的记录。命令执行结果如图果如图13.513.5所示。所示。 SELECT SELECT 编号编号, ,姓名姓名, ,实发工资实发工资 FROMFROM zggzzggz WHERE WHERE 实发工资实发工资1000 1000 AND AND 实发工实发工资资180020002000) ) AND (AND (zgdazgda. .编号编号= =zggzzggz. .编号编号) ) zgdazgda. .编号编号= =zggzzggz. .编号编号 &编号是联接的条件编号是联接的条件13

19、.2.4 13.2.4 简单的联接查询简单的联接查询【13.1013.10】在】在zgdazgda表和表和zggzzggz表中,检索职表中,检索职称是讲师称是讲师, , 并且实发工资大于并且实发工资大于19001900元的元的记录记录 SELECTSELECT zgda zgda. .编号编号, ,zgdazgda. .姓名姓名, ,zgdazgda. .职称职称, ,zggzzggz. .实发工资实发工资 FROMFROM zgda zgda, ,zggzzggz; ; WHERE ( WHERE (职称职称=讲师讲师) ) AND (AND (实实发工资发工资1900) 1900) AND

20、 (AND (zgdazgda. .编号编号= =zggzzggz. .编编号号) )13.2.5 13.2.5 嵌套查询嵌套查询嵌套查询是基于多个关系的查询嵌套查询是基于多个关系的查询, ,这类查询所要求的结果出自一个这类查询所要求的结果出自一个关系关系, ,但相关条件却涉及多个关系。这时就需要使用但相关条件却涉及多个关系。这时就需要使用SQLSQL的嵌套查的嵌套查询功能。询功能。格式:格式: 表达式比较运算符表达式比较运算符ANY|ALL|SOMEANY|ALL|SOME( (子查询子查询) ) NOTNOTEXISTS (EXISTS (子查询子查询) )说明:说明:(1)(1)其中的比

21、较运算符除了在第其中的比较运算符除了在第6 6章介绍的关系运算符之外,章介绍的关系运算符之外,还有前面提到的特殊运算符。还有前面提到的特殊运算符。(2(2) )ANYANY、ALLALL、SOMESOME是量词,其中是量词,其中ANYANY和和SOMESOME是同义词,在进行比是同义词,在进行比较运算时只要子查询中有一条记录为真,则结果为真;较运算时只要子查询中有一条记录为真,则结果为真;而而ALLALL则要则要求子查询中的所有记录都为真,结果才为真。求子查询中的所有记录都为真,结果才为真。(3)(3)EXISTSEXISTS是谓词,用来检查子查询中是否有结果返回是谓词,用来检查子查询中是否有

22、结果返回( (是否为空是否为空) )。NOT EXISTSNOT EXISTS表示是空的结果集。表示是空的结果集。13.2.5 13.2.5 嵌套查询嵌套查询为了讨论嵌套查询为了讨论嵌套查询, ,在此引入一个订货管在此引入一个订货管理数据库理数据库, ,此数据库涉及此数据库涉及4 4个表个表(4 (4 个关系个关系),),即仓库表、职工表、订购单表、供应即仓库表、职工表、订购单表、供应商表商表,4,4个表的内容分别如图个表的内容分别如图13.1113.11、13.1213.12、13.1313.13、13.1413.14所示。所示。13.2.5 13.2.5 嵌套查询嵌套查询【13.1113.

23、11】在仓库表和职工表中,检索哪些城】在仓库表和职工表中,检索哪些城市至少有一个仓库的职工工资为市至少有一个仓库的职工工资为12501250元元SELECT SELECT 城市城市 FROM FROM 仓库仓库 WHERE WHERE 仓库号仓库号 IN;IN; (SELECT (SELECT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资工资=1250)=1250)在这个命令中含有两个在这个命令中含有两个SELECT-FROM-WHERESELECT-FROM-WHERE查查询块询块, ,即内层查询块和外层查询块即内层查询块和外层查询块, ,内层查询块内层查询块检索

24、到的仓库号值是检索到的仓库号值是WH1WH1和和WH2, WH2, 这里这里ININ相当于相当于集合运算符集合运算符。这样就可写出等价的命令。这样就可写出等价的命令: : SELECT SELECT 城市城市 FROM FROM 仓库仓库 WHERE WHERE 仓库号仓库号 IN(WH1, WH2)IN(WH1, WH2)13.2.5 13.2.5 嵌套查询嵌套查询【13.1213.12】在仓库表和职工表中,检索所在仓库表和职工表中,检索所有职工的工资都多于为有职工的工资都多于为12101210元的仓库信元的仓库信息。息。 SELECT * FROM SELECT * FROM 仓库仓库 W

25、HERE WHERE 仓库号仓库号 NOT IN;NOT IN; (SELECT (SELECT 仓库号仓库号FROMFROM职工职工 WHEREWHERE工工资资=1210)=1210)13.2.5 13.2.5 嵌套查询嵌套查询内层内层SELECTSELECTFROMFROMWHEREWHERE查询块指出所有职工的工资少于或等于查询块指出所有职工的工资少于或等于12101210元的仓库的仓库号值的集合,在这里该集合只有一个值元的仓库的仓库号值的集合,在这里该集合只有一个值“WH1WH1”; ;然后从仓库关系中检索元组的仓库号属性值不在该集合然后从仓库关系中检索元组的仓库号属性值不在该集合中

26、的每个元组。有的读者也许已经注意到刚才的检索出现了错误,中的每个元组。有的读者也许已经注意到刚才的检索出现了错误,尽管在尽管在“武汉武汉”的的“WH4WH4”仓库还没有职工,但该仓库的信息也被仓库还没有职工,但该仓库的信息也被检索出来了。所以必须认真分析检索要求,写出正确的检索出来了。所以必须认真分析检索要求,写出正确的SQLSQL命令。命令。如果要求排除那些还没有职工的仓库,检索要求可以叙述为:检如果要求排除那些还没有职工的仓库,检索要求可以叙述为:检索所有职工的工资都多于索所有职工的工资都多于12101210元的仓库的信息,并且该仓库至少元的仓库的信息,并且该仓库至少要有一名职工。这样描述

27、就很清楚了,因为我们对没有职工的仓要有一名职工。这样描述就很清楚了,因为我们对没有职工的仓库不感兴趣。这样,写出库不感兴趣。这样,写出的的SQLSQL命令也就复杂一些了:命令也就复杂一些了: SELECT * FROM SELECT * FROM 仓库仓库 WHERE WHERE 仓库仓库号号 NOT IN;NOT IN; (SELECT (SELECT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资工资=1210);=1220=1220) ) AND (AND (工资工资=1240)=1240)显然使用显然使用BETWEENBETWEENANDAND表达条件更清晰、

28、更简洁。假如找出工表达条件更清晰、更简洁。假如找出工资不在资不在12201220元和元和12401240元之间的全部职工信息,可以用命令:元之间的全部职工信息,可以用命令: SELECT * FROM SELECT * FROM 职工职工 WHEREWHERE工资工资 NOT BETWEEN 1220 AND NOT BETWEEN 1220 AND 12401240命令执行结果如图命令执行结果如图13.2013.20所示。所示。13.2.5 13.2.5 嵌套查询嵌套查询【13.1513.15】在供应商表中】在供应商表中, ,检索出全部公司的信检索出全部公司的信息,不要工厂或其他供应商的信息

29、。这是一个息,不要工厂或其他供应商的信息。这是一个字符串匹配的查询,显然应该使用字符串匹配的查询,显然应该使用LIKELIKE运算符:运算符: SELECT * FROM SELECT * FROM 供应商供应商 WHERE WHERE 供应商名供应商名 LIKE %LIKE %公司公司 这里这里的的LIKELIKE是字符串匹配运算符,通配符是字符串匹配运算符,通配符“% %”表示表示0 0个或多个字符,另外还有一个通配个或多个字符,另外还有一个通配符符“- -”表示一个字符。表示一个字符。13.2.5 13.2.5 嵌套查询嵌套查询【13.1613.16】在供应商表中】在供应商表中, ,找出

30、不在北京的全部供应商找出不在北京的全部供应商的信息。的信息。 SELECT * FROM SELECT * FROM 供应商供应商 WHERE WHERE 地址地址!=!=北京北京 在在SQLSQL中,中,“不等于不等于”用用“!=!=”表示。另外还可以用否表示。另外还可以用否定运算符定运算符NOTNOT写出等价命令:写出等价命令: SELECT * FROM SELECT * FROM 供应商供应商 WHERE NOT(WHERE NOT(地址地址=北京北京)NOTNOT的应用范围很广,比如,可以有的应用范围很广,比如,可以有NOT IN(NOT IN(例例13.12)13.12)、NOT

31、BETWEENNOT BETWEEN等。等。13.2.6 13.2.6 排序排序SQLSQL中排序操作使用中排序操作使用ORDER BYORDER BY子句。子句。格式:格式:ORDER BY ORDER BY 关键字表达式关键字表达式1 1 ASC | DESCASC | DESC, , 关键字表达式关键字表达式2 2 ASC | DESCASC | DESC说明说明:ASCASC为升序为升序( (默认为升序默认为升序) ),DESCDESC为为降序。允许按一列或多列排序。降序。允许按一列或多列排序。13.2.6 13.2.6 排序排序【13.1713.17】在职工表中】在职工表中, ,按职

32、工的工资值按职工的工资值升序检索出全部职工的信息。升序检索出全部职工的信息。 SELECT * FROM SELECT * FROM 职工职工 ORDER BY ORDER BY 工资工资这里这里ORDER BYORDER BY是排序子句,如果需要将是排序子句,如果需要将结果按降序排列,只要加上结果按降序排列,只要加上DESCDESC。 SELECT * FROM SELECT * FROM 职工职工 ORDER BY ORDER BY 工资工资 DESCDESC13.2.6 13.2.6 排序排序【13.1813.18】在职工表中】在职工表中, ,先按仓库号排序,先按仓库号排序,再按工资排序

33、再按工资排序, ,并输出全部职工信息。并输出全部职工信息。 SELECT * FROM SELECT * FROM 职工职工 ORDER BY ORDER BY 仓库号仓库号, ,工资工资这里一个按多列排序的例子。这里一个按多列排序的例子。说明:说明:ORDER BYORDER BY是对最终的查询结果进是对最终的查询结果进行排序,不可以在子查询中使用该短语。行排序,不可以在子查询中使用该短语。13.2.7 13.2.7 简单的计算查询简单的计算查询SQLSQL语言是完备的,也就是说,只要数据是按关系方式语言是完备的,也就是说,只要数据是按关系方式存入数据库的,就能构造合适的存入数据库的,就能构

34、造合适的SQLSQL命令把它检索出来。命令把它检索出来。事实上,事实上,SQLSQL不仅具有一般的检索能力,而且还有计算不仅具有一般的检索能力,而且还有计算方式的检索,比如检索职工的平均工资、检索某个仓方式的检索,比如检索职工的平均工资、检索某个仓库中职工的最高工资值等。用于计算检索的函数有:库中职工的最高工资值等。用于计算检索的函数有:(1)(1)COUNTCOUNT计数计数(2)(2)SUMSUM求和求和(3)(3)AVGAVG计算平均值计算平均值(4)(4)MAXMAX求最大值求最大值(5)(5)MINMIN求最小值求最小值这些函数可以用这些函数可以用在在SELECTSELECT短语中对

35、查询结果进行计算。短语中对查询结果进行计算。13.2.7 13.2.7 简单的计算查询简单的计算查询【13.1913.19】在供应商表中】在供应商表中, ,找出供应商所在地的找出供应商所在地的数目。数目。 SELECT COUNT (DISTINCT SELECT COUNT (DISTINCT 地址地址) ) FROM FROM 供供应商应商参见前面给出的供应商的记录值,其中共有参见前面给出的供应商的记录值,其中共有5 5个地址:北京、西安、郑州、上海和深圳。所个地址:北京、西安、郑州、上海和深圳。所以结果为以结果为5 5。说明,除非对关系中的元组个数进行计数,一说明,除非对关系中的元组个数

36、进行计数,一般应用般应用COUNTCOUNT函数应该使用函数应该使用DISTINCTDISTINCT。例如:例如: SELECT COUNT(*) FROM SELECT COUNT(*) FROM 供应商供应商将给出供应商关系中的记录数是将给出供应商关系中的记录数是6 6个。个。13.2.7 13.2.7 简单的计算查询简单的计算查询【13.2013.20】在职工表中】在职工表中, ,求支付的工资总数。求支付的工资总数。 SELECT SUM(SELECT SUM(工资工资) ) FROM FROM 职工职工结果是:结果是:61606160。这个结果是职工关系中的工资。这个结果是职工关系中的

37、工资值的总和,它并不管是否有重复值。这时若使值的总和,它并不管是否有重复值。这时若使用命令:用命令: SELECT SUM(DISTINCTSELECT SUM(DISTINCT工资工资) ) FROM FROM 职工职工将得出错误的结果将得出错误的结果49104910。原因是。原因是DISTINCTDISTINCT命令命令去掉重复值去掉重复值12501250。13.2.7 13.2.7 简单的计算查询简单的计算查询【13.2113.21】在职工表和仓库表中】在职工表和仓库表中, ,求北京求北京和上海的仓库职工的工资总和。和上海的仓库职工的工资总和。 SELECT SUM(SELECT SUM

38、(工资工资) ) FROM FROM 职工职工WHEREWHERE仓仓库号库号IN;IN;(SELECT (SELECT 仓库号仓库号 FROM FROM 仓库仓库 WHERE WHERE 城市城市=北京北京 OR OR 城市城市=上海上海)13.2.7 13.2.7 简单的计算查询简单的计算查询13.22 13.22 在仓库表和职工表中在仓库表和职工表中, ,求所有职工的工资都多于求所有职工的工资都多于12101210元的元的仓库的平均面积。仓库的平均面积。 SELECT AVG(SELECT AVG(面积面积) ) FROM FROM 仓库仓库 WHERE WHERE 仓库号仓库号 NOT

39、 IN;NOT IN; (SELECT (SELECT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资工资=1210)=1210)结果是:结果是:366.67366.67这里要注意,以上结果的运算包含了尚没有职工这里要注意,以上结果的运算包含了尚没有职工的的WH4WH4仓库。如果仓库。如果要排除没有职工的仓库要排除没有职工的仓库, ,以上语句应该改为:以上语句应该改为: SELECT AVG(SELECT AVG(面积面积) ) FROM FROM 仓库仓库 WHERE WHERE 仓库号仓库号 NOT IN;NOT IN; (SELECT (SELECT 仓库号仓库

40、号 FROM FROM 职工职工 WHERE WHERE 工资工资=1210);=2HAVING COUNT(*)=2HAVINGHAVING子句总是跟在子句总是跟在GROUP BY GROUP BY 子句之后,不可以单独使用。子句之后,不可以单独使用。HAVINGHAVING子句和子句和WHERE WHERE 子句不矛盾,在查询中是先用子句不矛盾,在查询中是先用WHEREWHERE子句限定子句限定元组,然后再进行分组,最后再用元组,然后再进行分组,最后再用HAVINGHAVING子句限定分组。子句限定分组。说明:说明:HAVINGHAVING子句和子句和WHEREWHERE子句的区别:子句的

41、区别:WHEREWHERE子句是用来指定表子句是用来指定表中各行所应满足的条件,而中各行所应满足的条件,而HAVINGHAVING子句是用来指定每一分组所满足的条件,只有满足子句是用来指定每一分组所满足的条件,只有满足HAVINGHAVING条件的那些组才能在结果中被显示。条件的那些组才能在结果中被显示。13.2.9 13.2.9 别名的使用别名的使用在联接操作中,经常需要使用关系名作前缀,有时这样显得很麻在联接操作中,经常需要使用关系名作前缀,有时这样显得很麻烦。因此,烦。因此,SQLSQL允许在允许在FROMFROM短语中为关系名定义别名。短语中为关系名定义别名。格式:关系名别名格式:关系

42、名别名例如:如下的联接语句是一个基于例如:如下的联接语句是一个基于4 4个关系的联接查询,其中必须个关系的联接查询,其中必须使用关系名作前缀:使用关系名作前缀: SELECT SELECT 供应商名供应商名 FROM FROM 供应商,订购单,职工,仓库供应商,订购单,职工,仓库; ; WHERE WHERE 地址地址=北京北京 AND AND 城市城市=北京北京; AND AND 供应商供应商. .供应商号供应商号= =订购单订购单. .供应商号供应商号; ; AND AND 订购单订购单. .职工职工= =职工职工. .职工号职工号; ; AND AND 职工职工. .仓库号仓库号= =仓

43、库仓库. .仓库号仓库号13.2.9 13.2.9 别名的使用别名的使用在上面的查询中,如果使用别名就会简单一些,如下是使用了别在上面的查询中,如果使用别名就会简单一些,如下是使用了别名的同样的联接查询语句:名的同样的联接查询语句: SELECT SELECT 供应商名供应商名 FROM FROM 供应商供应商 S,S,订购单订购单 P,P,职工职工 E E,仓库仓库 W;W; WHERE WHERE 地址地址=北京北京 AND AND 城市城市=北京北京; AND S.AND S.供应商号供应商号= =P.P.供应商号供应商号; ; AND P.AND P.职工号职工号= =E.E.职工号职

44、工号; ; AND E.AND E.仓库号仓库号= =W.W.仓库号仓库号FROM FROM 供应商供应商 S S,订购单订购单 P P,职工职工 E E,仓库仓库 W W,用用S S、P P、E E和和W W分别分别代表供应商表、订购单表代表供应商表、订购单表、职工表和仓库表。、职工表和仓库表。说明:在嵌套的说明:在嵌套的SQLSQL子句中不能使用外层定义的别名。子句中不能使用外层定义的别名。13.2.10 13.2.10 内外层互相关嵌套查内外层互相关嵌套查询询嵌套查询都是外层查询依赖于内层查询嵌套查询都是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。的结果,而内层查询与外层查询

45、无关。事实上,有时也需要内、外层互相关的事实上,有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层询提供值,而外层查询的条件需要内层查询的结果。查询的结果。13.2.10 13.2.10 内外层互相关嵌套查内外层互相关嵌套查询询【13.2613.26】在订购单表中】在订购单表中, ,列出每个职工经手的列出每个职工经手的具有最高总金额的订购单信息。这里先给出相具有最高总金额的订购单信息。这里先给出相应的查询语句,然后再作必要的解释。应的查询语句,然后再作必要的解释。 SELECT out.SELECT out.职工号,

46、职工号,out.out.供应商号供应商号,out.out.订购订购单号,单号,out.out.订购日期订购日期,out.out.总金额总金额; ; FROM FROM 订购单订购单 out WHERE out WHERE 总金额总金额=(=(SELECT MAX(SELECT MAX(总金额总金额) ) FROM FROM 订购单订购单 inner1;inner1; WHERE out. WHERE out.职工号职工号= =inner1.inner1.职工号职工号) )13.2.10 13.2.10 内外层互相关嵌套查内外层互相关嵌套查询询在这个查询中,外层查询和内层查询使在这个查询中,外层

47、查询和内层查询使用同一个关系用同一个关系: :订购单表,给他们分别指订购单表,给他们分别指定别名定别名outout和和inner1inner1。外层查询提供外层查询提供outout关系中每个元组的职工号值给内层查询关系中每个元组的职工号值给内层查询使用使用; ;内层查询利用这个职工号值,确定内层查询利用这个职工号值,确定该职工经手的具有最高总金额的订购单该职工经手的具有最高总金额的订购单和总金额和总金额; ;随后外层查询再根据随后外层查询再根据outout关系关系的同一元组的总金额与该总金额值进行的同一元组的总金额与该总金额值进行比较,如果相等,则该元组被选择。比较,如果相等,则该元组被选择。

48、13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询前面已经使用过和嵌套查询或子查询有关的前面已经使用过和嵌套查询或子查询有关的ININ和和NOT NOT ININ运算符,除此之外还有两类和子查询有关的运算符。运算符,除此之外还有两类和子查询有关的运算符。格式:表达式比较运算符格式:表达式比较运算符ANY|ALL|SOMEANY|ALL|SOME( (子查询子查询) ) NOTNOTEXISTS(EXISTS(子查询子查询) )ANYANY、ALLALL和和SOMESOME是量词,其中是量词,其中ANYANY和和SOMESOME是同义词,在是同义词,在进行比较运算时只要子查

49、询中有一行能使结果为真,进行比较运算时只要子查询中有一行能使结果为真,则结果就为真。则结果就为真。ALLALL则要求子查询中的所有行都使结果则要求子查询中的所有行都使结果为真时,结果才为真。为真时,结果才为真。EXISTSEXISTS是谓词,是谓词,EXISTSEXISTS或或NOT EXISTSNOT EXISTS是用来检查在子是用来检查在子查询中是否有结果返回,即存在元组或不存在元组。查询中是否有结果返回,即存在元组或不存在元组。13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询下面通过几个例子来理解这些量词和谓下面通过几个例子来理解这些量词和谓词在查询中的用法和用途

50、。词在查询中的用法和用途。【13.2713.27】在仓库表和职工表中】在仓库表和职工表中, ,检索哪检索哪些仓库中还没有职工的仓库的信息。些仓库中还没有职工的仓库的信息。13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询这里的查询是没有职工或不存在职工,所以可以使用这里的查询是没有职工或不存在职工,所以可以使用谓词谓词NOT EXISTSNOT EXISTS。 SELECT * FROM SELECT * FROM 仓库仓库 WHERE NOT EXISTS;WHERE NOT EXISTS; (SELECT * FROM (SELECT * FROM 职工职工 WHER

51、E WHERE 仓库号仓库号= =仓库仓库. .仓库号仓库号) )说明:这里的内层查询引用了外层查询的表,只有这说明:这里的内层查询引用了外层查询的表,只有这样使用谓词样使用谓词EXISTSEXISTS或或NOT EXISTS NOT EXISTS 才有意义。所以这类才有意义。所以这类查询也都是内、外层互相关嵌套查询。查询也都是内、外层互相关嵌套查询。以上的查询命令等价于如下查询命令:以上的查询命令等价于如下查询命令: SELECT * FROM SELECT * FROM 仓库仓库 WHERE WHERE 仓库号仓库号 NOT IN NOT IN (SELECT (SELECT 仓库号仓库号

52、 FROM FROM 职工职工) )13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询【13.2813.28】在仓库表和职工中】在仓库表和职工中, ,检索哪些仓库中检索哪些仓库中至少已经有一个职工的仓库的信息。至少已经有一个职工的仓库的信息。 SELECT * FROM SELECT * FROM 仓库仓库 WHERE EXISTS;WHERE EXISTS; (SELECT * FROM (SELECT * FROM 职工职工 WHERE WHERE 仓库号仓库号= =仓库仓库. .仓库号仓库号) )说明:说明:NOTNOTEXISTSEXISTS只是判断子查询中是否只

53、是判断子查询中是否有或没有结果返回,它本身并没有任何运算或有或没有结果返回,它本身并没有任何运算或比较。比较。13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询【13.2913.29】在职工表中】在职工表中, , 检索有职工的工资大于或等于检索有职工的工资大于或等于WH1WH1仓库中仓库中任何一名职工工资的仓库号。任何一名职工工资的仓库号。这个查询可以使用这个查询可以使用ANYANY或或SOMESOME量词。量词。 SELECT DISTINCT SELECT DISTINCT 仓库仓库号号 FROM FROM 职工职工 WHERE WHERE 工资工资=ANY;ANY;

54、 (SELECT (SELECT 工资工资 FROM FROM 职工职工 WHERE WHERE 仓库号仓库号= = WH1)WH1)它等价于:它等价于: SELECT DISTINCT SELECT DISTINCT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资工资=;=; ( (SELECT MIN(SELECT MIN(工资工资) ) FROM FROM 职工职工 WHERE WHERE 仓库号仓库号= = WH1)WH1)13.2.11 13.2.11 使用量词和谓词的查使用量词和谓词的查询询【13.3013.30】在职工表中在职工表中, , 检索有职工的工

55、资大于或等于检索有职工的工资大于或等于WH1WH1仓库中所有职工工资的仓库号。这个查询使用仓库中所有职工工资的仓库号。这个查询使用ALLALL量词。量词。 SELECT DISTINCT SELECT DISTINCT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资工资=ALL;ALL; (SELECT (SELECT 工资工资 FROM FROM 职工职工 WHERE WHERE 仓库号仓库号=WH1)WH1)它等价于:它等价于: SELECT DISTINCT SELECT DISTINCT 仓库号仓库号 FROM FROM 职工职工 WHERE WHERE 工资

56、工资=;=; ( (SELECT MAX(SELECT MAX(工资工资) ) FROM FROM 职工职工 WHERE WHERE 仓库仓库号号=WH1)WH1)13.2.12 13.2.12 超联接查询超联接查询SQLSQL中中FROMFROM子句后的联接称为超联接,超联接子句后的联接称为超联接,超联接有四种形式。有四种形式。格式格式:FROM FROM 表名表名 INNER | LEFT INNER | LEFT OUTEROUTER | RIGHT | RIGHT OUTEROUTER | FULL | FULL OUTEROUTER JOIN JOIN 数据库名数据库名 ! ! 表名

57、表名 ASAS Local_Alias Local_AliasON ON 联接条件联接条件说明:说明:OUTEROUTER关键字可被省略,包含关键字可被省略,包含OUTEROUTER强调强调这是一个外连接这是一个外连接( (outer join)outer join)。13.2.12 13.2.12 超联接查询超联接查询下面我们分别以几个实例来说明这四种下面我们分别以几个实例来说明这四种超联接的含义及区别。超联接的含义及区别。1.1.内部联接内部联接使用使用INNER JOININNER JOIN形式的联接称为内部联接,形式的联接称为内部联接,INNER JOININNER JOIN等价于等价

58、于JOINJOIN。INNER JOININNER JOIN与普通与普通联接相同:只有满足条件的记录才出现在查联接相同:只有满足条件的记录才出现在查询结果中。询结果中。内部联接是满足联接条件的记录才出现在查内部联接是满足联接条件的记录才出现在查询结果中。询结果中。13.2.12 13.2.12 超联接查询超联接查询【13.3113.31】将仓库表和职工表的职工号字段联接在一起。】将仓库表和职工表的职工号字段联接在一起。 SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工号职工号, ,工资工资; ; FROM FROM 仓库仓库 JOINJOIN职工职工

59、ON ON 仓库仓库. .仓库号仓库号= =职工职工. .仓库号仓库号如下两种命令格式也是等价的:如下两种命令格式也是等价的: SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工号职工号, ,工资工资; ; FROM FROM 仓库仓库 INNER JOIN INNER JOIN 职工职工ON ON 仓库仓库. .仓库号仓库号= =职工职工. .仓库仓库号和号和 SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工号职工号, ,工资工资; ; FROM FROM 仓库,职工仓库,职工WHEREWHERE仓库仓库.

60、 .仓库号仓库号= =职工职工. .仓库号仓库号13.2.12 13.2.12 超联接查询超联接查询2.2.左联接左联接使用使用LEFTLEFTOUTER OUTER JOIN JOIN称为左联接,在称为左联接,在查询结果中包含查询结果中包含JOINJOIN左侧表中的所有记录,左侧表中的所有记录,以及以及JOINJOIN右侧表中匹配的记录。右侧表中匹配的记录。左联接,即除满足联接条件的记录出现在查左联接,即除满足联接条件的记录出现在查询结果中外,第一个表中不满足联接条件的询结果中外,第一个表中不满足联接条件的记录记录也出现在查询结果中。也出现在查询结果中。13.2.12 13.2.12 超联接

61、查询超联接查询【13.3213.32】将仓库表和职工表的职工号和工资字段联接】将仓库表和职工表的职工号和工资字段联接在一起。在一起。 SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工号职工号, ,工资工资; ; FROM FROM 仓库仓库 LEFT JOIN LEFT JOIN 职工职工; ; ON ON 仓库仓库. .仓库号仓库号= =职工职工. .仓库号仓库号从以上查询结果中可以看到,首先以左边表即从以上查询结果中可以看到,首先以左边表即A A表中的表中的第一条记录为准,在第一条记录为准,在B B表中查询,找到了,则显示,找表中查询,找到了,则

62、显示,找不到相应的字段不到相应的字段以以NULLNULL显示,本例中有相应的值。以显示,本例中有相应的值。以下记录也是按照这种方法进行查询的。下记录也是按照这种方法进行查询的。13.2.12 13.2.12 超联接查询超联接查询3.3.右联接右联接使用使用RIGHT RIGHT OUTER OUTER JOIN JOIN称为右联接,在查询称为右联接,在查询结果中包含结果中包含JOINJOIN右侧表中的所有记录,以及右侧表中的所有记录,以及JOINJOIN左左侧表中匹配的记录。侧表中匹配的记录。为了看到右联接和全联接的效果,假设在职工表中为了看到右联接和全联接的效果,假设在职工表中插入了如下一条

63、记录插入了如下一条记录: : WH8WH8,E8E8,12001200右联接,即除满足联接条件的记录出现在查询右联接,即除满足联接条件的记录出现在查询结果中外,第二个表中不满足联接条件的记录结果中外,第二个表中不满足联接条件的记录也出现在查询结果中。也出现在查询结果中。13.2.12 13.2.12 超联接查询超联接查询【13.3313.33】将仓库表和职工表的职工号和】将仓库表和职工表的职工号和工资字段联接在一起。工资字段联接在一起。 SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工职工号号, ,工资工资; ; FROM FROM 仓库仓库 RIG

64、HT JOIN RIGHT JOIN 职工职工 ON ON 仓库仓库. .仓库号仓库号= =职工职工. .仓库号仓库号实际上职工实际上职工“E8E8”所在的仓库并不存在,所在的仓库并不存在,这在实际应用中是不允许的。这在实际应用中是不允许的。13.2.12 13.2.12 超联接查询超联接查询4.4.完全联接完全联接FULL FULL OUTEROUTER JOIN JOIN称为完全联接,在查称为完全联接,在查询结果中包含询结果中包含JOINJOIN两侧所有的匹配记录和不两侧所有的匹配记录和不匹配匹配的记录。的记录。完全联接,即除满足联接条件的记录出完全联接,即除满足联接条件的记录出现在查询结

65、果中外,两个表中不满足联现在查询结果中外,两个表中不满足联接条件的记录也出现在查询结果中。接条件的记录也出现在查询结果中。13.2.12 13.2.12 超联接查询超联接查询【13.3413.34】将仓库表和职工表的职工号和工资】将仓库表和职工表的职工号和工资字段联接在一起。字段联接在一起。 SELECT SELECT 仓库仓库. .仓库号仓库号, ,城市城市, ,面积面积, ,职工号职工号, ,工资工资; ; FROM FROM 仓库仓库 FULL JOINFULL JOIN职工职工 ON ON 仓库仓库. .仓库号仓库号= =职工职工. .仓库号仓库号说明:说明:Visual FoxPro

66、Visual FoxPro的的SQL SELECTSQL SELECT语句的联语句的联接格式只能实现两个表的联接,如果要实现多接格式只能实现两个表的联接,如果要实现多个表的联接,还需要使用标准格式。个表的联接,还需要使用标准格式。13.2.12 13.2.12 超联接查询超联接查询例如下面是一个基于例如下面是一个基于4 4个关系的联接查询。个关系的联接查询。SELECT SELECT 仓库仓库. .仓库号,城市,供应商名,地址仓库号,城市,供应商名,地址; ; FROM FROM 供应商供应商, ,订购单订购单, ,职工职工, ,仓库仓库; ; WHERE WHERE 供应商供应商. .供应商

67、号供应商号= =订购单订购单. .供应商供应商号号; ; AND AND 订购单订购单. .职工号职工号= =职工职工. .职工号职工号; ; AND AND 职工职工. .仓库号仓库号= =仓库仓库. .仓库号仓库号这样的查询用这样的查询用Visual FoxProVisual FoxPro的专门格式就写的专门格式就写不出来了。不出来了。13.2.13 13.2.13 集合的并运算集合的并运算使用使用UNIONUNION子句可以进行集合的并运算,即可以将两个子句可以进行集合的并运算,即可以将两个SELECTSELECT语句语句的查询结果合并成一个查询结果。当然,要求进行并运算的两个的查询结果

68、合并成一个查询结果。当然,要求进行并运算的两个查询结果具有相同的字段个数,并且对应字段的值要具有相同的查询结果具有相同的字段个数,并且对应字段的值要具有相同的数据类型和取值范围。格式:数据类型和取值范围。格式:SelcctSelcct命令命令1 1UNION UNION ALLALLSelcctSelcct命令命令2 2说明:说明:(1)(1)可以使用多个可以使用多个UNIONUNION子句子句,ALLALL选项防止删除合并结果中重复的选项防止删除合并结果中重复的行行( (记录记录) )。(2)(2)不能使用不能使用UNIONUNION来组合子查询。来组合子查询。(3)(3)只有最后的只有最后

69、的SelcctSelcct命令中可以包含命令中可以包含ORDER BYORDER BY子句,而且必子句,而且必须按编号指出排序的列须按编号指出排序的列( (它它将影响整个结果将影响整个结果) )。13.2.13 13.2.13 集合的并运算集合的并运算【13.3513.35】在仓库表中】在仓库表中, ,显示城市为北京显示城市为北京和上海的仓库信息。和上海的仓库信息。 SELECT * FROM SELECT * FROM 仓库仓库 WHERE WHERE 城市城市=北北京京; UNION;UNION; SELECT * FROM SELECT * FROM 仓库仓库 WHERE WHERE 城

70、市城市=上海上海 13.2.14 13.2.14 查询输出去向查询输出去向1.1.显示部分结果显示部分结果格式格式: : TOP TOP 表达式表达式PERCENTPERCENT功能功能: :显示需要满足条件的前几个记录。显示需要满足条件的前几个记录。说明说明: :(1)(1)表达式是数字表达式,当不使用表达式是数字表达式,当不使用PERCENTPERCENT时,时,表达式是表达式是1 1至至32 76732 767间的整数,说明显示前几间的整数,说明显示前几个记录。个记录。(2)(2)当使用当使用PERCENTPERCENT时,表达式是时,表达式是0.010.01至至99.9999.99间的

71、实数,说明显示结果中前百分之几的记录。需间的实数,说明显示结果中前百分之几的记录。需要注意的是要注意的是TOPTOP短语要短语要与与ORDERBYORDERBY短语同时使用才有短语同时使用才有效。效。13.2.14 13.2.14 查询输出去向查询输出去向【13.3613.36】在职工表中】在职工表中, , 显示工资最高的显示工资最高的三位职工的信息。三位职工的信息。 SELECT * TOP 3 FROM SELECT * TOP 3 FROM 职工职工 ORDER BY ORDER BY 工资工资 DESCDESC【13.3713.37】在职工表中在职工表中, , 显示工资最低的那显示工资

72、最低的那30%30%职工的信息。命令执行结果如图职工的信息。命令执行结果如图13.4713.47所所示。示。 SELECT * TOP 30 PERCENT FROM SELECT * TOP 30 PERCENT FROM 职工职工 ORDER BY ORDER BY 工资工资 13.2.14 13.2.14 查询输出去向查询输出去向2.2.将查询结果存放到数组中将查询结果存放到数组中格式格式: : INTO ARRAY INTO ARRAY 数组名数组名功能功能: : 将查询结果存放到数组中。将查询结果存放到数组中。说明说明: : 数组名可以是任意的数组变数组名可以是任意的数组变量名。一般

73、将存放查询结果的数组作为量名。一般将存放查询结果的数组作为二维数组来使用,每行一条记录,每列二维数组来使用,每行一条记录,每列对应于查询结果一列。查询结果存放在对应于查询结果一列。查询结果存放在数组中,可以非常方便地在程序中使用。数组中,可以非常方便地在程序中使用。13.2.14 13.2.14 查询输出去向查询输出去向【13.3813.38】将查询到的职工信息存放在数】将查询到的职工信息存放在数组组T1T1中。中。 SELECT * FROM SELECT * FROM 职工职工 INTO ARRAY T1INTO ARRAY T1T1(1,1)T1(1,1)存放的是第一条记录的仓库号字段存

74、放的是第一条记录的仓库号字段值,值,T1(1T1(1,3)3)存放的是第一条记录的工资字存放的是第一条记录的工资字段值等。段值等。13.2.14 13.2.14 查询输出去向查询输出去向3.3.将查询结果存放在临时文件中将查询结果存放在临时文件中格式格式: : INTO CURSORINTO CURSOR临时表临时表 功能功能: :将查询结果存放到临时数据库文件中。将查询结果存放到临时数据库文件中。说明说明: : 临时表是临时表是 临时文件名,该短语临时文件名,该短语产生的临时文件是一个只读产生的临时文件是一个只读dbfdbf文件,当查文件,当查询结束后该临时文件是当前文件,可能像一询结束后该

75、临时文件是当前文件,可能像一般般的的dbfdbf文件一样使用,但仅是只读。当关文件一样使用,但仅是只读。当关闭文件时该文件将自动删除。闭文件时该文件将自动删除。13.2.14 13.2.14 查询输出去向查询输出去向【13.3913.39】将查询到的职工表信息存放在】将查询到的职工表信息存放在临时临时dbfdbf文件文件T2T2中。中。 SELECT * FROM SELECT * FROM 职工职工 INTO CURSOR T2INTO CURSOR T2一般利用一般利用INTO CURSORINTO CURSOR短语存放一些临时结短语存放一些临时结果,比如一些复杂的汇总可能需要分阶段完果,

76、比如一些复杂的汇总可能需要分阶段完成,需要根据几个中间结果再汇总等,这时成,需要根据几个中间结果再汇总等,这时利用该短语存放中间结果就非常合适,当使利用该短语存放中间结果就非常合适,当使用完后临时文件会自动删除。用完后临时文件会自动删除。13.2.14 13.2.14 查询输出去向查询输出去向4.4.将查询结果存放到永久表中将查询结果存放到永久表中格式格式: : INTO DBF|TABLE INTO DBF|TABLE 表名表名 功能功能: : 可以将查询结果存放到永久表中可以将查询结果存放到永久表中( (dbfdbf文件文件) )。13.2.14 13.2.14 查询输出去向查询输出去向【

77、13.4013.40】在职工表中】在职工表中, , 显示工资最高的显示工资最高的三位职工的信息三位职工的信息, ,查询结果存放在表查询结果存放在表AlAl中。中。 SELECT * TOP 3 FROM SELECT * TOP 3 FROM 职工职工 INTO INTO TABLE A1 ORDER BY TABLE A1 ORDER BY 工资工资 DESCDESC13.2.14 13.2.14 查询输出去向查询输出去向5.5.将查询结果存放到文本文件中将查询结果存放到文本文件中格式格式:TO FILE TO FILE 文本文件名文本文件名 ADDITIVEADDITIVE功能:可以将查询

78、结果存放到文本文件功能:可以将查询结果存放到文本文件中。中。说明:文本文件名说明:文本文件名( (默认扩展名默认扩展名是是txt)txt),如果使用如果使用ADDITIVEADDITIVE选项,结果将追加在选项,结果将追加在原文件的尾部,否则将覆盖原有文件。原文件的尾部,否则将覆盖原有文件。13.2.14 13.2.14 查询输出去向查询输出去向【13.4113.41】将查询结果以文本的形式存储】将查询结果以文本的形式存储在文本文件在文本文件A2.txtA2.txt中。中。 SELECT * TOP 3 FROM SELECT * TOP 3 FROM 职工职工 TO FILF TO FILF

79、 A2 ORDER BY A2 ORDER BY 工资工资 DESCDESC如果如果TOTO短语和短语和INTOINTO短语同时使用短语同时使用,则,则TOTO短语短语将会被忽略。将会被忽略。13.2.14 13.2.14 查询输出去向查询输出去向6.6.将查询结果直接输出到屏幕将查询结果直接输出到屏幕格式格式: :TO SCREENTO SCREEN功能功能: :将查询结果输出到屏幕。将查询结果输出到屏幕。13.2.14 13.2.14 查询输出去向查询输出去向7.7.将查询结果直接输出到打印机将查询结果直接输出到打印机格式格式: :TO PRINTER TO PRINTER PROMPTP

80、ROMPT功能功能: :将查询结果输出到打印机,如果使用了将查询结果输出到打印机,如果使用了PROMPTPROMPT选项,在开始打印之前会打开打印机设选项,在开始打印之前会打开打印机设置对话框置对话框。FROM FROM 子句中子句中INTO INTO 与与TOTO选项,用于选项,用于指定查询结果的输出去向,默认查询结果显示指定查询结果的输出去向,默认查询结果显示在浏览窗口中。在浏览窗口中。INTOINTO选项中的查询结果有选项中的查询结果有3 3种种:ARRAYARRAY数组、数组、CURSORCURSOR临时表、临时表、TABLE | DBFTABLE | DBF表名表名。TOTO选项也有

81、选项也有3 3种:文本种:文本文件、屏幕、打印机。文件、屏幕、打印机。13.2.14 13.2.14 查询输出去向查询输出去向本节用大量实例介绍本节用大量实例介绍了了SQL SELECTSQL SELECT语句语句的使用方法,这些实例都可以的使用方法,这些实例都可以在在Visual Visual FoxProFoxPro下执行。掌握下执行。掌握SQL SELECTSQL SELECT不仅对不仅对学好、用好学好、用好Visual FoxProVisual FoxPro至关重要,也至关重要,也是以后使用其他数据库或开发数据库应是以后使用其他数据库或开发数据库应用程序的基础。用程序的基础。13.3

82、13.3 操作功能操作功能SQLSQL语言的操作功能包括对表中数据的增语言的操作功能包括对表中数据的增加、删除和更新操作。加、删除和更新操作。13.3.1 13.3.1 插入插入在一个表的尾部追加数据时,要用到插入功能在一个表的尾部追加数据时,要用到插入功能,SQLSQL的的插入命令包括以下插入命令包括以下3 3种格式:种格式:格式:格式: INSERT INTO INSERT INTO 表名表名 ( (字段名字段名1 1 ,字段名,字段名2 2,) ) VALUES(VALUES(表达式表达式1 1) ), , 表达式表达式2 2,) )和和 INSERT INTO INSERT INTO

83、表名表名 FROM ARRAY FROM ARRAY 数组名数组名 INSERT INTO INSERT INTO 表名表名 FROM MEMVARFROM MEMVAR功能:功能:3 3种格式都是在指定的表的表尾添加一条新记录。种格式都是在指定的表的表尾添加一条新记录。13.3.1 13.3.1 插入插入说明:说明:(1)(1)第第1 1种格式其值为种格式其值为VALUESVALUES后面的表达式的值。当需要插入表中所后面的表达式的值。当需要插入表中所有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式必须与表的结构完成吻合;若

84、只需要插入表中某些字段的数据,就必须与表的结构完成吻合;若只需要插入表中某些字段的数据,就需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。(2)(2)第第2 2种格式新记录的值是指定的数组中各元素的数据。数组中各种格式新记录的值是指定的数组中各元素的数据。数组中各元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应的字段类型不一致,则新记录对应的字段为空值;如果表中字段个的字段类型不一致,则新记录对应的字段为空值;如果表中字段个数大于数组元素的个数,则多的字段

85、为空值。数大于数组元素的个数,则多的字段为空值。(3)(3)第第3 3种格式新记录的值是指定的内存变量的值。添加的新记录的种格式新记录的值是指定的内存变量的值。添加的新记录的值是与指定表各字段名同名的内存变量的值,如果同名的内存变量值是与指定表各字段名同名的内存变量的值,如果同名的内存变量不存在,则相应的字段为空。不存在,则相应的字段为空。Visual FoxProVisual FoxPro支持两种支持两种SQLSQL插入命令的格式,第一种格式是标准格插入命令的格式,第一种格式是标准格式,第二种格式式,第二种格式是是Visual FoxProVisual FoxPro的特殊格式。的特殊格式。1

86、3.3.1 13.3.1 插入插入【13.4213.42】在订购单表中,插入元组】在订购单表中,插入元组(E7,S4,OR01,09E7,S4,OR01,09252503)03)。 INSERT INTO INSERT INTO 订购单订购单( (职工号职工号, ,供应商号供应商号, ,订购订购单号单号, ,订购日期订购日期, ,总金额总金额) ) VALUES(E7,S4,OR01,2003-09-VALUES(E7,S4,OR01,2003-09-25,1200)25,1200)其中其中“2003-09-252003-09-25”是日期型字段订购日期的是日期型字段订购日期的值。值。图图13

87、.4813.4813.3.1 13.3.1 插入插入假设供应商尚未确定,那么只能先插入假设供应商尚未确定,那么只能先插入职工号和订购单号两个属性的值,这时职工号和订购单号两个属性的值,这时可用如下命令:可用如下命令: INSERT INTO INSERT INTO 订购单订购单( (职工号,订购单职工号,订购单号号) ) VALUES(E7,OR01)VALUES(E7,OR01)这时另外三个属性的值为空。这时另外三个属性的值为空。13.3.1 13.3.1 插入插入下面用一组命令来说明下面用一组命令来说明INSERT INTOINSERT INTOFROM ARRAY FROM ARRAY

88、的使用方式:的使用方式: USEUSE订购单订购单 & &打开订购单打开订购单 SCATTER to A1 &SCATTER to A1 &将当前记录读到数组将当前记录读到数组A1A1 COPY STRUCTURE TO A2 & COPY STRUCTURE TO A2 &拷贝订购单表的结构拷贝订购单表的结构到到A2A2 INSERT INTO A2 FROM ARRAY A1 & INSERT INTO A2 FROM ARRAY A1 &从数组从数组A1A1插入一条记插入一条记录到录到A2A2 SELECT A2 & SELECT A2 &切换到切换到A2A2的工作区的工作区 BROWS

89、E &BROWSE &用用BROWSEBROWSE命令验证插命令验证插入的结果入的结果 USE &USE &关闭关闭A2.dbfA2.dbf文件文件 DELETE FILE A2.dbf &DELETE FILE A2.dbf &删除删除A2.dbfA2.dbf文件文件13.3.1 13.3.1 插入插入在一个表的尾部追加数据时,要用到插入功能在一个表的尾部追加数据时,要用到插入功能,SQLSQL的的插入命令包括以下插入命令包括以下3 3种格式:种格式:格式:格式: INSERT INTO INSERT INTO 表名表名 ( (字段名字段名1 1 ,字段名,字段名2 2,) ) VALUES

90、(VALUES(表达式表达式1 1) ), , 表达式表达式2 2,) )和和 INSERT INTO INSERT INTO 表名表名 FROM ARRAY FROM ARRAY 数组名数组名 INSERT INTO INSERT INTO 表名表名 FROM MEMVARFROM MEMVAR功能:功能:3 3种格式都是在指定的表的表尾添加一条新记录。种格式都是在指定的表的表尾添加一条新记录。13.3.1 13.3.1 插入插入说明:说明:(1)(1)第第1 1种格式其值为种格式其值为VALUESVALUES后面的表达式的值。当需要插入表中所后面的表达式的值。当需要插入表中所有字段的数据时

91、,表名后面的字段名可以缺省,但插入数据的格式有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式必须与表的结构完成吻合;若只需要插入表中某些字段的数据,就必须与表的结构完成吻合;若只需要插入表中某些字段的数据,就需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。(2)(2)第第2 2种格式新记录的值是指定的数组中各元素的数据。数组中各种格式新记录的值是指定的数组中各元素的数据。数组中各元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应的字段类型不一致,则

92、新记录对应的字段为空值;如果表中字段个的字段类型不一致,则新记录对应的字段为空值;如果表中字段个数大于数组元素的个数,则多的字段为空值。数大于数组元素的个数,则多的字段为空值。(3)(3)第第3 3种格式新记录的值是指定的内存变量的值。添加的新记录的种格式新记录的值是指定的内存变量的值。添加的新记录的值是与指定表各字段名同名的内存变量的值,如果同名的内存变量值是与指定表各字段名同名的内存变量的值,如果同名的内存变量不存在,则相应的字段为空。不存在,则相应的字段为空。Visual FoxProVisual FoxPro支持两种支持两种SQLSQL插入命令的格式,第一种格式是标准格插入命令的格式,

93、第一种格式是标准格式,第二种格式式,第二种格式是是Visual FoxProVisual FoxPro的特殊格式。的特殊格式。13.3.1 13.3.1 插入插入【13.4213.42】在订购单表中,插入元组】在订购单表中,插入元组(E7,S4,OR01,09E7,S4,OR01,09252503)03)。命令执行命令执行结果如图结果如图13.4813.48所示。所示。 INSERT INTO INSERT INTO 订购单订购单( (职工号职工号, ,供应商号供应商号, ,订购订购单号单号, ,订购日期订购日期, ,总金额总金额) ) VALUES(E7,S4,OR01,2003-09-VA

94、LUES(E7,S4,OR01,2003-09-25,1200)25,1200)其中其中“2003-09-252003-09-25”是日期型字段订购日期的是日期型字段订购日期的值。值。图图13.4813.4813.3.1 13.3.1 插入插入假设供应商尚未确定,那么只能先插入假设供应商尚未确定,那么只能先插入职工号和订购单号两个属性的值,这时职工号和订购单号两个属性的值,这时可用如下命令:可用如下命令: INSERT INTO INSERT INTO 订购单订购单( (职工号,订购单职工号,订购单号号) ) VALUES(E7,OR01)VALUES(E7,OR01)这时另外三个属性的值为空

95、。这时另外三个属性的值为空。13.3.1 13.3.1 插入插入下面用一组命令来说明下面用一组命令来说明INSERT INTOINSERT INTOFROM ARRAY FROM ARRAY 的使用方式:的使用方式: USEUSE订购单订购单 & &打开订购单打开订购单 SCATTER to A1 &SCATTER to A1 &将当前记录读到数组将当前记录读到数组A1A1 COPY STRUCTURE TO A2 & COPY STRUCTURE TO A2 &拷贝订购单表的结构拷贝订购单表的结构到到A2A2 INSERT INTO A2 FROM ARRAY A1 & INSERT INT

96、O A2 FROM ARRAY A1 &从数组从数组A1A1插入一条记插入一条记录到录到A2A2 SELECT A2 & SELECT A2 &切换到切换到A2A2的工作区的工作区 BROWSE &BROWSE &用用BROWSEBROWSE命令验证插命令验证插入的结果入的结果 USE &USE &关闭关闭A2.dbfA2.dbf文件文件 DELETE FILE A2.dbf &DELETE FILE A2.dbf &删除删除A2.dbfA2.dbf文件文件13.3.1 13.3.1 插入插入用下面一组命令来说明用下面一组命令来说明INSERT INTOINSERT INTOFROM MEMV

97、ARFROM MEMVAR的使用方式:的使用方式: USEUSE订购单订购单 & &打开订购单打开订购单 SCATTER M1 &SCATTER M1 &将当前记录读到内存将当前记录读到内存变量变量M1M1中中 COPY STRUCTURE TO A2 © STRUCTURE TO A2 &拷贝订购单表的结构拷贝订购单表的结构到到A2A2 INSETR INTO A2 FROM M1 & INSETR INTO A2 FROM M1 &从内存变量插入一条从内存变量插入一条记录记录到到A2A2 SELECT A2 & SELECT A2 &切换到切换到A2A2的工作区的工作区 BROWS

98、E &BROWSE &用用BROWSEBROWSE命令验证插命令验证插入的结果入的结果 USE &USE &关闭关闭A2.dbfA2.dbf文件文件 DELETE FILE A2.dbf &DELETE FILE A2.dbf &删除删除A2.dbfA2.dbf文件文件13.3.1 13.3.1 插入插入说明:当一个表定义了主索引或候选索说明:当一个表定义了主索引或候选索引后,由于相应的字段具有关键字的特引后,由于相应的字段具有关键字的特性,即不能为空,所以只能用此命令插性,即不能为空,所以只能用此命令插入记录入记录。FoxProFoxPro以前的插入命令以前的插入命令( (INSERTINS

99、ERT或或APPEND)APPEND)是先插入一条空记录,然后再是先插入一条空记录,然后再输入各字段的值,由于关键字字段不允输入各字段的值,由于关键字字段不允许为空,所以使用以前的方法就不能成许为空,所以使用以前的方法就不能成功地插入记录。功地插入记录。13.3.2 13.3.2 更新更新更新是指对存储在表中的记录进行修改。更新是指对存储在表中的记录进行修改。格式:格式:UPDATE UPDATE 数据库数据库! ! 表名表名 SET SET 列名列名1 1= =表达式表达式1 1 , , 列名列名2 2= =表达式表达式2 2 WHERE WHERE 条件表达式条件表达式1 1 AND |

100、OR AND | OR 条件表达式条件表达式2 2 13.3.2 13.3.2 更新更新说明:说明:(1)(1)数据库数据库! ! 表名:指定要更新数据表名:指定要更新数据的记录所在的表名及该表所在的数据库名。的记录所在的表名及该表所在的数据库名。(2)(2)SET SET 列名列名= =表达式:指定被更新的字段表达式:指定被更新的字段及该字段的新值。如果省略及该字段的新值。如果省略WHEREWHERE子句,则该字段子句,则该字段每一条都用同样的值更新。每一条都用同样的值更新。(3)(3)WHERE WHERE 条件表达式:指明将要更新数据的条件表达式:指明将要更新数据的记录。即更新表中符合条

101、件表达式的记录,并且一记录。即更新表中符合条件表达式的记录,并且一次可以更新多个字段次可以更新多个字段; ;如果不使用如果不使用WHEREWHERE子句,则更子句,则更新全部记录。新全部记录。13.3.2 13.3.2 更新更新【13.4313.43】在职工表中】在职工表中, ,给给WH1WH1仓库的职工仓库的职工提高提高10%10%的工资。命令执行结果如图的工资。命令执行结果如图13.4913.49所示。所示。 UPDATE UPDATE 职工职工 SET SET 工资工资= =工资工资*1.10 *1.10 WHERE WHERE 仓库仓库号号=WH1WH1例如例如: : 将所有学生的年龄

102、增加将所有学生的年龄增加1 1岁:岁: UPDATE UPDATE 学生学生 SET SET 年龄年龄= =年龄年龄+1+1图图13.4913.4913.3.3 13.3.3 删除删除用用SQLSQL语言可以删除数据表中的记录。语言可以删除数据表中的记录。格式:格式:DELETE FROM DELETE FROM 数据库数据库! ! 表名表名 WHERE WHERE 条件表达式条件表达式1 1 AND | OR AND | OR 条件表达式条件表达式2 2 说明:说明:(1)(1)数据库数据库! ! 表名:指定加删除标记的表名及该表所表名:指定加删除标记的表名及该表所在的数据库名,用在的数据库

103、名,用“!”分割表名和数据库名,数据库名为可选项。分割表名和数据库名,数据库名为可选项。(2)(2)WHEREWHERE选项:指明只对满足条件的记录加删除标记。如果不使用选项:指明只对满足条件的记录加删除标记。如果不使用WHEREWHERE子句,则删除该表中的全部记录。子句,则删除该表中的全部记录。(3)(3)上述删除只是加删除标记,并没有从物理上删除,只有执行上述删除只是加删除标记,并没有从物理上删除,只有执行了了PACKPACK命令,有删除标记的记录才能真正从表中删除。删除标记可以命令,有删除标记的记录才能真正从表中删除。删除标记可以用用REACLLREACLL命令取消。命令取消。13.3

104、.3 13.3.3 删除删除【13.4413.44】删除仓库表中仓库号值是】删除仓库表中仓库号值是WH2WH2的记录。的记录。 DELETE FROM DELETE FROM 仓库仓库 WHEREWHERE仓库号仓库号=WH2WH2说明:说明:SQL DELETESQL DELETE命令同样是逻辑删除记录,命令同样是逻辑删除记录,如果要物理删除记录需要继续使用如果要物理删除记录需要继续使用PACKPACK命令。命令。13.4 13.4 定义功能定义功能标准标准SQLSQL的数据定义功能非常广泛,一般的数据定义功能非常广泛,一般包括数据库的定义、表的定义、视图的包括数据库的定义、表的定义、视图的

105、定义、存储过程的定义、规则的定义和定义、存储过程的定义、规则的定义和索引的定义等若干部分。在本节将主要索引的定义等若干部分。在本节将主要介绍介绍Visual FoxProVisual FoxPro支持的表定义功能和支持的表定义功能和视图定义功能。视图定义功能。13.4.1 13.4.1 表结构的定义表结构的定义在第在第3 3章中已介绍了通过表设计器建立表章中已介绍了通过表设计器建立表的方法,在的方法,在Visual FoxProVisual FoxPro中也可以通过中也可以通过SQLSQL的的CREATE TABLECREATE TABLE命令建立表。命令建立表。现在介绍怎样利用现在介绍怎样利

106、用SQLSQL命令来建立相同的命令来建立相同的数据库,然后可以利用数据库设计器和数据库,然后可以利用数据库设计器和表设计器来检验用表设计器来检验用SQLSQL建立的数据库,读建立的数据库,读者可以从中作一些对比。表结构的定义者可以从中作一些对比。表结构的定义是指创建一个含有指定字段的表。是指创建一个含有指定字段的表。13.4.1 13.4.1 表结构的定义表结构的定义格式:格式: CREATE TABLE |DBF CREATE TABLE |DBF 表名表名1 1 NAME NAME 长表名长表名 FREEFREE ( (字段名字段名1 1 类型类型 ( (字段宽度字段宽度 , , 小数位数

107、小数位数 ) ) NULL | NOT NULLNULL | NOT NULL CHECK CHECK 逻辑表达式逻辑表达式1 1 ERROR ERROR 字符型文本信息字符型文本信息1 1 DEFAULT DEFAULT 表达式表达式1 1 PRIMARY KEY | UNIQUEPRIMARY KEY | UNIQUE REFERENCES REFERENCES 表名表名2 2 TAG TAG 标识名标识名1 1 NOCPTRANSNOCPTRANS, ,字段名字段名2 2 , ,PRIMARY KEY PRIMARY KEY 表达式表达式2 2 TAG TAG 标识名标识名2 2 |,

108、|,UNIQUE UNIQUE 表达式表达式3 3 TAG TAG 标识标识3 3 , ,FOREIGN KEY FOREIGN KEY 表达式表达式4 4 TAG TAG 标识名标识名4 4 NODUPNODUP REFERENCES REFERENCES 表名表名3 3 TAG TAG 标识名标识名5 5 , ,CHECK CHECK 逻辑表达式逻辑表达式2 2 ERROR ERROR 字符型文本信息字符型文本信息2 2 ) ) | |FROM ARRAY FROM ARRAY 数组名数组名13.4.1 13.4.1 表结构的定义表结构的定义说明说明:用:用CREATE TABLECREA

109、TE TABLE命令可以完成第命令可以完成第3 3章中介绍的章中介绍的“表设计器表设计器”具有的所有操作。具有的所有操作。(1)(1)TABLETABLE和和DBFDBF选项等价,都是建立表文件。选项等价,都是建立表文件。(2)(2)表名:为新建表指定表名。表名:为新建表指定表名。(3) (3) NAMENAME长表名:为新建表指定一个长表名。只有打开数据库,在数据库中创建表时,才能指定长表名:为新建表指定一个长表名。只有打开数据库,在数据库中创建表时,才能指定一个长表名。长表名最多可以包含一个长表名。长表名最多可以包含128128个字符。个字符。(4(4) )FREEFREE:建立的表是自由

110、表,不加入到打开的数据库中。当没有打开数据库时,建立的表都是自由表。建立的表是自由表,不加入到打开的数据库中。当没有打开数据库时,建立的表都是自由表。(5) (5) 字段名字段名1 1类型类型 ( (字段宽度字段宽度, ,小数位数小数位数 ) ) :指定字段名、字段类型、字段:指定字段名、字段类型、字段宽度及小数位数。字段类型可以用一个字符表示。宽度及小数位数。字段类型可以用一个字符表示。(6(6) )NULLNULL:允许该字段值为空;允许该字段值为空;NOT NULLNOT NULL:该字段值不能为空。缺省值为该字段值不能为空。缺省值为NOT NULLNOT NULL。(7)CHECK(7

111、)CHECK逻辑表达式逻辑表达式1 1:指定该字段的合法值及该字段值的约束条件。:指定该字段的合法值及该字段值的约束条件。(8)(8)ERRORERROR字符型文本信息字符型文本信息1 1:指定在浏览或编辑窗口中该字段输入的值不符合:指定在浏览或编辑窗口中该字段输入的值不符合CHECKCHECK子句的合法值子句的合法值时,时,VFPVFP显示的错误信息。显示的错误信息。(9)(9)DEFAULTDEFAULT表达式:为该字段指定一个缺省值,表达式的数据类型与该字段的数据类型要一致。表达式:为该字段指定一个缺省值,表达式的数据类型与该字段的数据类型要一致。即每添加一条记录时,该字段自动取该缺省值

112、。即每添加一条记录时,该字段自动取该缺省值。(10)(10)PRIMARY KEYPRIMARY KEY:为该字段创建一个主索引,索引标识名与字段名相同。主索引字段值必须惟一为该字段创建一个主索引,索引标识名与字段名相同。主索引字段值必须惟一。UNIQUEUNIQUE:为该字段创建一个候选索引,索引标识名与字段名相同。为该字段创建一个候选索引,索引标识名与字段名相同。(11)(11)REFERENCES REFERENCES 表名表名 TAG TAG 标识名标识名 :指定建立持久关系的父表,同时以该字段为索引:指定建立持久关系的父表,同时以该字段为索引关键字建立外索引,用该字段名作为索引标识名

113、。表名为父表表名,标识名为父表中的索引标识名。关键字建立外索引,用该字段名作为索引标识名。表名为父表表名,标识名为父表中的索引标识名。如果省略索引标识名,则用父表的主索引关键字建立关系,否则不能省略。如果指定了索引标识名,如果省略索引标识名,则用父表的主索引关键字建立关系,否则不能省略。如果指定了索引标识名,则在父表中存在索引标识字段上建立关系。父表不能是自由表。则在父表中存在索引标识字段上建立关系。父表不能是自由表。(12(12) )CHECK CHECK 逻辑表达式逻辑表达式2 2ERROR ERROR 字符型文本信息字符型文本信息2 2 :由逻辑表达式指定表的合法值。不合:由逻辑表达式指

114、定表的合法值。不合法时,显示由字符型文本信息指定的错误信息。该信息只有在浏览或编辑窗口中修改数据时显示。法时,显示由字符型文本信息指定的错误信息。该信息只有在浏览或编辑窗口中修改数据时显示。(13)(13)FROM ARRAY FROM ARRAY 数组名:由数组创建表结构。数组名指定的数组包含表的每一个字段的字段名、数组名:由数组创建表结构。数组名指定的数组包含表的每一个字段的字段名、字段类型、字段宽度及小数位数。字段类型、字段宽度及小数位数。用用SQLSQL命令来建立的数据表,可以与用命令来建立的数据表,可以与用“表设计器表设计器”建立的表作对比。建立的表作对比。13.4.1 13.4.1

115、 表结构的定义表结构的定义【13.4513.45】用命令建立订货管理】用命令建立订货管理1 1数据库。数据库。 CREATE DATABASE D:CREATE DATABASE D:VFP1VFP1订货管理订货管理1 &1 &建立订货管理建立订货管理1 1数据库数据库用用SQL CREATESQL CREATE命令建立仓库命令建立仓库1 1表。表。 OPEN DATABASE OPEN DATABASE 订货管理订货管理1 &1 &打开订货管理打开订货管理1 1数据库数据库 CREATE TABLE D:CREATE TABLE D:VFP1VFP1仓库仓库1 (1 (仓库号仓库号 C (5

116、) PRIMARY KEY,;C (5) PRIMARY KEY,; 城市城市 C (10),C (10),面积面积 I CHECK (I CHECK (面积面积0) 0) ERROR ERROR 面积应该大于面积应该大于0!)&0!)&建立仓库表建立仓库表1 113.4.1 13.4.1 表结构的定义表结构的定义说明说明: :(1)(1)PRIMARY KEYPRIMARY KEY说明仓库号是主索引。说明仓库号是主索引。( (2)2)CHECKCHECK为面积字段值说明了有效性规则为面积字段值说明了有效性规则( (面积面积0) 0) 。执行完如上命令后在项目管理器中立刻可以执行完如上命令后在

117、项目管理器中立刻可以看到仓库看到仓库1 1表。命令执行结果如图表。命令执行结果如图13.5013.50所示。所示。图图13.5013.5013.4.1 13.4.1 表结构的定义表结构的定义【13.4613.46】用】用SQL CREATE SQL CREATE 命令建立订购单命令建立订购单1 1表。表。 CREATE TABLE D:CREATE TABLE D:VFP1VFP1订购单订购单1(1(职工号职工号 C C (5),(5),供应商号供应商号 C (5),;C (5),; 订购单号订购单号 C (5) PRIMARY KEY, C (5) PRIMARY KEY, 订购日期订购日期

118、 D)D)以上所有建立表的命令执行完后可以在数据库设计以上所有建立表的命令执行完后可以在数据库设计器中看到如图器中看到如图13.5113.51所示的界面,从中可以看到通所示的界面,从中可以看到通过过SQL CREATESQL CREATE命令不仅可以建立表,同时还建立起命令不仅可以建立表,同时还建立起了表之间的联系。然后可以用第了表之间的联系。然后可以用第4 4章介绍的方法来章介绍的方法来编辑参照完整性,进一步完善数据库的设计。编辑参照完整性,进一步完善数据库的设计。13.4.1 13.4.1 表结构的定义表结构的定义说明说明: :(1)(1)用用SQL CREATESQL CREATE命令新

119、建的表自动在最低命令新建的表自动在最低可用工作区打开,并可以通过别名引用,新可用工作区打开,并可以通过别名引用,新表的打开方式为独占方式,忽略表的打开方式为独占方式,忽略SET SET EXCLUSIVEEXCLUSIVE的当前设置。的当前设置。(2)(2)如果建立自由表如果建立自由表( (当前没有打开的数据库当前没有打开的数据库或使用了或使用了FREE)FREE),则很多选项在命令中不能则很多选项在命令中不能使用,如使用,如NAMENAME、CHECKCHECK、DEFAULTDEFAULT、FOREIGN FOREIGN KEYKEY、PRIMARY KEYPRIMARY KEY和和REF

120、ERENCESREFERENCES等。等。13.4.2 13.4.2 表的删除表的删除随着数据库应用的变化,往往有些表连同它的数据不随着数据库应用的变化,往往有些表连同它的数据不再需要了,这时可以删除这些表,以节省存储空间。再需要了,这时可以删除这些表,以节省存储空间。格式:格式:DROP TABLE DROP TABLE 表名表名说明:说明:DROP TABLEDROP TABLE直接从磁盘上删除表名所对应的直接从磁盘上删除表名所对应的DBFDBF文件。如果表名是数据库中的表,并且相应的数据库文件。如果表名是数据库中的表,并且相应的数据库是当前数据库,则从数据库中删除表;否则虽然从磁是当前数

121、据库,则从数据库中删除表;否则虽然从磁盘上删除盘上删除了了DBFDBF文件,但是记录在数据库文件,但是记录在数据库DBCDBC文件中的文件中的信息却没有删除,此后会出现错误提示。所以要删除信息却没有删除,此后会出现错误提示。所以要删除数据库中的表时,最好应使数据库是当前打开的数据数据库中的表时,最好应使数据库是当前打开的数据库,在数据库中进行操作。库,在数据库中进行操作。13.4.3 13.4.3 表结构的修改表结构的修改用户使用数据时,随着应用要求的改变,用户使用数据时,随着应用要求的改变,往往需要对原来的表格结构进行修改,往往需要对原来的表格结构进行修改,修改表结构的修改表结构的SQLSQ

122、L命令命令是是ALTER TABLEALTER TABLE,该命令格式有三种。该命令格式有三种。13.4.3 13.4.3 表结构的修改表结构的修改1.1.第第1 1种格式种格式第第1 1种格式的种格式的ALTER TABLEALTER TABLE命令可以为指定的表添加字段或修命令可以为指定的表添加字段或修改已有的字段。改已有的字段。格式:格式: ALTER TABLE ALTER TABLE 表名表名1 1 ADD | ALTER ADD | ALTER COLUMNCOLUMN 字段名字段名1 1字段类型字段类型( (长度,小数位长度,小数位数数) )NULL | NOT NULLNULL

123、 | NOT NULL CHECKCHECK逻辑表达式逻辑表达式1 1ERRORERROR字符型文本信息字符型文本信息DEFAULTDEFAULT表达式表达式1 1 PRIMARY KEY | UNIQUEPRIMARY KEY | UNIQUEREFERENCES REFERENCES 表名表名2 2 TAG TAG 标识名标识名1 1 NOCPTRANSNOCPTRANS13.4.3 13.4.3 表结构的修改表结构的修改说明:说明:(1)(1)表名表名1 1:指明被修改表的表名。:指明被修改表的表名。(2)(2)ADD ADD COLUMNCOLUMN:该子句指出新增加列的字段该子句指出

124、新增加列的字段名及他们的数据类型等信息。在名及他们的数据类型等信息。在ADDADD子句中使用子句中使用CHECKCHECK、PRIMARY KEYPRIMARY KEY、UNIQUEUNIQUE任选项时,需要删除任选项时,需要删除所有数据,否则违反有效性规则,命令不被执行。所有数据,否则违反有效性规则,命令不被执行。(3)(3)ALTER ALTER COLUMNCOLUMN:该子句指出要修改列的字该子句指出要修改列的字段名以及他们的数据类型等信息。在段名以及他们的数据类型等信息。在ALTERALTER子句中子句中使用使用CHECKCHECK任选项时,需要被修改字段的已有数据任选项时,需要被修

125、改字段的已有数据满足满足CHECKCHECK规则;使用规则;使用PRIMARY KEYPRIMARY KEY、UNIQUEUNIQUE任选项任选项时,需要被修改字段的已有数据满足惟一性,不能时,需要被修改字段的已有数据满足惟一性,不能有重复有重复值。值。13.4.3 13.4.3 表结构的修改表结构的修改【13.4713.47】为订购单】为订购单1 1表增加一个整型类表增加一个整型类型的数量字段。型的数量字段。 ALTER TABLE ALTER TABLE 订购单订购单1;1; ADD ADD 数量数量 I CHECK I CHECK 数量数量0 0 ERROR ERROR 数量应该大于数量

126、应该大于0!0!13.4.3 13.4.3 表结构的修改表结构的修改【13.4813.48】将购单】将购单1 1表的订购单号字段的表的订购单号字段的宽度由原来的宽度由原来的5 5改为改为6 6。 ALTER TABLE ALTER TABLE 订购单订购单1 1 ALTER ALTER 订购单号订购单号 C(6)C(6)从命令格式可以看出,该格式可以修改字段从命令格式可以看出,该格式可以修改字段的类型、宽度、有效性规则、错误信息、默的类型、宽度、有效性规则、错误信息、默认值,定义主关键字和联系等认值,定义主关键字和联系等; ;但是不能修但是不能修改字段名,不能删除字段,也不能删除已经改字段名,

127、不能删除字段,也不能删除已经定义的规则等。定义的规则等。13.4.3 13.4.3 表结构的修改表结构的修改2.2.第第2 2种格式种格式第第2 2种格式种格式的的ALTER TABLEALTER TABLE命令,主要用于修改指定命令,主要用于修改指定表中指定字段的表中指定字段的DEFAULTDEFAULT和和CHECKCHECK约束规则,不影响约束规则,不影响原有表的数据。原有表的数据。格式:格式: ALTER TABLEALTER TABLE表名表名ALTER ALTER COLUMNCOLUMN字字段名段名NULL | NOT NULLNULL | NOT NULL SET DEFAUL

128、T SET DEFAULT 表达式表达式 SET CHECK SET CHECK 逻辑表达式逻辑表达式ERROR ERROR 字符型文本信息字符型文本信息 DROP DEFAULTDROP DEFAULT DROP CHECKDROP CHECK13.4.3 13.4.3 表结构的修改表结构的修改说明:说明:(1)(1)表名:指明被修改表的表名。表名:指明被修改表的表名。(2(2) )ALTER ALTER COLUMNCOLUMN 字段名:指出要修改列的字段名。字段名:指出要修改列的字段名。(3)(3)NULL | NOT NULLNULL | NOT NULL:指定字段可以为空或不能为空。

129、指定字段可以为空或不能为空。(4(4) )SET DEFAULT SET DEFAULT 表达式:重新设置字段的缺省值。表达式:重新设置字段的缺省值。(5)(5)SET CHECK SET CHECK 逻辑表达式逻辑表达式 ERROR ERROR 字符型文本信息字符型文本信息 :重新设置该字段的合法值,要求该字段的原有数据满:重新设置该字段的合法值,要求该字段的原有数据满足合法值。足合法值。(6(6) )DROP DEFAULTDROP DEFAULT:删除缺省值。删除缺省值。(7(7) )DROP CHECKDROP CHECK:删除该字段的合法限定。删除该字段的合法限定。13.4.3 13

130、.4.3 表结构的修改表结构的修改【13.4913.49】修改或定义数量字段的有效性】修改或定义数量字段的有效性规则。规则。 ALTER TABLE ALTER TABLE 订购单订购单1;1; ALTER ALTER 数量数量 SET CHECK SET CHECK 数量数量0 0 ERROR ERROR 数量应该大于数量应该大于0013.4.3 13.4.3 表结构的修改表结构的修改【13.5013.50】删除数量字段的有效性规则。】删除数量字段的有效性规则。 ALTER TABLE ALTER TABLE 订购单订购单1 1 ALTER ALTER 数量数量 DROP CHECKDROP

131、 CHECK以上两种格式都不能删除字段,也不能更改以上两种格式都不能删除字段,也不能更改字段名。第字段名。第3 3格式正是在这些方面对前两种格式正是在这些方面对前两种格式的补充。格式的补充。13.4.3 13.4.3 表结构的修改表结构的修改3.3.第第3 3种格式种格式第第3 3种格式的种格式的ALTER TABLEALTER TABLE命令,可以删除指定表中的指定字段、修改字段名、命令,可以删除指定表中的指定字段、修改字段名、修改指定表完整性规则,包括添加或删除主索引、外索引、候选索引及表的修改指定表完整性规则,包括添加或删除主索引、外索引、候选索引及表的合法值限定。合法值限定。格式:格式

132、: ALTER TABLE ALTER TABLE 表名表名 DROP DROP COLUMNCOLUMN 字段名字段名1 1 SET CHECK SET CHECK 逻辑表达式逻辑表达式1 1ERRORERROR字符型文本信息字符型文本信息 DROP CHECKDROP CHECK ADD PRIMARY KEYADD PRIMARY KEY表达式表达式1 1TAGTAG标识名标识名1 1FORFOR逻辑表达式逻辑表达式2 2 DROP PRIMARY KEYDROP PRIMARY KEY ADD UNIQUE ADD UNIQUE 表达式表达式2 2 TAG TAG 标识名标识名2 2F

133、ORFOR逻辑表达式逻辑表达式3 3 DROP UNIQUE TAGDROP UNIQUE TAG标识名标识名3 3 ADD FOREIGN KEY ADD FOREIGN KEY 表达式表达式3 3TAGTAG标识名标识名4 4FORFOR逻逻辑表达式辑表达式4 4 REFERENCES REFERENCES 表名表名2 2 TAGTAG标识名标识名4 4 DROP FOREIGN KEY TAGDROP FOREIGN KEY TAG标识名标识名5 5 SAVESAVE RENAME COLUMNRENAME COLUMN字段名字段名2 2TOTO字段名字段名3 3 NOVALIDATEN

134、OVALIDATE13.4.3 13.4.3 表结构的修改表结构的修改说明:说明:(1)(1)DROPDROPCOLUMNCOLUMN 字段名:从指定表中删除指定的字段。字段名:从指定表中删除指定的字段。(2)(2)SET CHECK SET CHECK 逻辑表达式逻辑表达式 ERRORERROR字符型文本信息:为该表指定字符型文本信息:为该表指定合法值及错误提示信息。合法值及错误提示信息。DROP CHECKDROP CHECK:删除该表的合法值限定。删除该表的合法值限定。 (3)(3)ADD PRIMARY KEY ADD PRIMARY KEY 表达式表达式 TAG TAG 标识名:为该

135、表建立主索引,一标识名:为该表建立主索引,一个表只能有一个主索引。个表只能有一个主索引。DROP PRIMARY KEYDROP PRIMARY KEY:删除该表的主索引。删除该表的主索引。( (4)4)ADD UNIQUE ADD UNIQUE 表达式表达式 TAG TAG 标识名标识名 :为该表建立候选索引,:为该表建立候选索引,一个表可以有多个候选索引。一个表可以有多个候选索引。DROP UIQUE TAGDROP UIQUE TAG标识名:删除该表的候选标识名:删除该表的候选索引。索引。(5)(5)ADD FOREIGN KEYADD FOREIGN KEY:为该表建立外为该表建立外(

136、 (非主非主) )索引,与指定的父表建立关系,索引,与指定的父表建立关系,一个表可以有多个外索引。一个表可以有多个外索引。(6)(6)DROP FOREIGN KEY TAGDROP FOREIGN KEY TAG标识名:删除外索引,取消与父表的关系,标识名:删除外索引,取消与父表的关系,SAVESAVE子句将保存该索引。子句将保存该索引。(7(7) )RENAME COLUMN RENAME COLUMN 字段名字段名2 2TOTO字段名字段名3 3:修改字段名,字段名:修改字段名,字段名2 2指定指定要修改的字段名,字段名要修改的字段名,字段名3 3指定新的字段名。指定新的字段名。(8)(

137、8)NOVALIDATENOVALIDATE:修改表结构时,允许违反该表的数据完整性规则,默认值为修改表结构时,允许违反该表的数据完整性规则,默认值为禁止违反数据完整性规则。禁止违反数据完整性规则。注意:修改自由表时,不能使用注意:修改自由表时,不能使用DEFAULTDEFAULT,FOREIGN KEYFOREIGN KEY,PRIMARY KEYPRIMARY KEY,REFERENCESREFERENCES或或SETSET子句。子句。13.4.3 13.4.3 表结构的修改表结构的修改【13.5113.51】将订购单】将订购单1 1表的总金额字段名表的总金额字段名改为金额。改为金额。 A

138、LTER TABLE ALTER TABLE 订购单订购单1 1 RENAME COLUMN RENAME COLUMN 总金额总金额 TO TO 金额金额13.4.3 13.4.3 表结构的修改表结构的修改【13.5213.52】删除订购单】删除订购单1 1表中的金额字段。表中的金额字段。 ALTER TABLE ALTER TABLE 订购单订购单1 1 DROP COLUMN DROP COLUMN 金金额额13.4.3 13.4.3 表结构的修改表结构的修改【13.5313.53】将订购单】将订购单1 1表的职工号和供应表的职工号和供应商号定义为候选索引商号定义为候选索引( (候选关键

139、字候选关键字) ),索,索引名是引名是e1e1。 ALTER TABLE ALTER TABLE 订购单订购单1 1 ADD UNIQUE ADD UNIQUE 职职工号工号+ +供应商号供应商号 TAG e1TAG e113.4.3 13.4.3 表结构的修改表结构的修改【13.5413.54】删除订购单删除订购单1 1表中的候选索引表中的候选索引e1e1。 ALTER TABLE ALTER TABLE 订购单订购单1 1 DROP UNIQUE DROP UNIQUE TAG e1TAG e113.4.4 13.4.4 视图的定义视图的定义在在Visual FoxProVisual Fo

140、xPro中视图是一个定制的虚拟表,中视图是一个定制的虚拟表,可以是本地的、远程的或带参数的。视图可引可以是本地的、远程的或带参数的。视图可引用一个或多个表,或者引用其他视图。视图是用一个或多个表,或者引用其他视图。视图是可更新的,它可引用远程表。可更新的,它可引用远程表。在关系数据库中,视图也称作窗口,即视图是在关系数据库中,视图也称作窗口,即视图是操作表的窗口,可以把它看作是从表中派生出操作表的窗口,可以把它看作是从表中派生出来的虚表。它依赖于表,但不独立存在。来的虚表。它依赖于表,但不独立存在。在第在第5 5章中已经介绍了如何使用章中已经介绍了如何使用“视图设计器视图设计器”来创建视图,本

141、节介绍如何利用来创建视图,本节介绍如何利用SQLSQL语言语言13.4.4 13.4.4 视图的定义视图的定义建立视图。视图是根据对表的查询定义的。建立视图。视图是根据对表的查询定义的。格式格式:CREATE CREATE SQLSQL VIEW VIEW视图名视图名( (字段名字段名1 1, , 字段名字段名2 2 ) )ASAS查询语句查询语句说明:说明:(1)(1)查询语句:可以是任意查询语句:可以是任意的的SELECTSELECT查询语句,查询语句,它说明并限制了视图中的数据。如果没有为视图指它说明并限制了视图中的数据。如果没有为视图指定字段名,视图中的字段名将与查询语句中指定字段名,

142、视图中的字段名将与查询语句中指定的字段名相同。定的字段名相同。(2)(2)视图必须建立在数据库中。视图必须建立在数据库中。1.1.从单个表派生出的视图从单个表派生出的视图13.4.4 13.4.4 视图的定义视图的定义【13.5513.55】在职工表中定义视图。】在职工表中定义视图。 CREATE VIEW W1 AS;CREATE VIEW W1 AS; SELECT SELECT 职工号职工号, ,仓库号仓库号 FROM FROM 职工职工 13.4.4 13.4.4 视图的定义视图的定义其中其中W1W1是视图的名称。视图一经定义,就可以是视图的名称。视图一经定义,就可以和基本表一样进行各

143、种查询,也可以进行一些和基本表一样进行各种查询,也可以进行一些修改操作。对于最终用户来说,有时并不需要修改操作。对于最终用户来说,有时并不需要知道操作的是基本表还是视图。为了查询职工知道操作的是基本表还是视图。为了查询职工号和仓库号信息,可以有命令:号和仓库号信息,可以有命令: SELECT * FROM W1SELECT * FROM W1或或 SELECT SELECT 职工号职工号, ,仓库号仓库号 FROM W1FROM W1或或 SELECT SELECT 职工号职工号, ,仓库号仓库号 FROM FROM 职工职工13.4.4 13.4.4 视图的定义视图的定义3 3个命令效果相同

144、。个命令效果相同。上面是限定列构成的视图,下面再限定上面是限定列构成的视图,下面再限定行定义一个视图。行定义一个视图。13.4.4 13.4.4 视图的定义视图的定义【13.5613.56】在职工表中】在职工表中, ,查询北京仓库的查询北京仓库的信息,定义如下视图。信息,定义如下视图。 CREATE VIEW W2 AS;CREATE VIEW W2 AS; SELECT * FROM SELECT * FROM 仓库仓库 WHERE WHERE 城市城市=北京北京 这里这里W2W2中只有北京仓库的信息。中只有北京仓库的信息。13.4.4 13.4.4 视图的定义视图的定义2.2.从多个表派生

145、出的视图从多个表派生出的视图从上面的例子可以看出,视图一方面可从上面的例子可以看出,视图一方面可以限定对数据的访问,另一方面又可以以限定对数据的访问,另一方面又可以简化对数据的访问。简化对数据的访问。13.4.4 13.4.4 视图的定义视图的定义【13.5713.57】在订购单表中】在订购单表中, ,列出每个职工经手的具有最列出每个职工经手的具有最高总金额的订购单信息高总金额的订购单信息, , 定义视图。定义视图。 CREATE VIEW W3 AS;CREATE VIEW W3 AS; SELECT out. SELECT out.职工号职工号, ,out.out.供应商号供应商号, ,o

146、ut.out.订购单号订购单号, ,out.out.订购日期订购日期, ,out.out.总金额总金额; ; FROM FROM 订购单订购单 out WHERE out WHERE 总金额总金额=;=; ( (SELECT MAX(SELECT MAX(总金额总金额) )FROM FROM 订购单订购单 inner1;inner1; WHERE out. WHERE out.职工号职工号= =inner1.inner1.职工号职工号) )这时候再提出同样的查询要求,就只需要输入以下命令即可:这时候再提出同样的查询要求,就只需要输入以下命令即可: SELECT * FROM W3 SELECT

147、 * FROM W3 13.4.4 13.4.4 视图的定义视图的定义【13.5813.58】定义视图向用户提供职工号、】定义视图向用户提供职工号、职工的工资和职工工作所在城市的信息。职工的工资和职工工作所在城市的信息。 CREATE VIEW W4 AS;CREATE VIEW W4 AS; SELECT SELECT 职工号职工号, ,工资工资, ,城市城市 FROM FROM 职工职工, ,仓库仓库; ; WHERE WHERE 职工职工. .仓库号仓库号= =仓库仓库. .仓库号仓库号结果对用户就好像有一个包含字段职工号、结果对用户就好像有一个包含字段职工号、工资和城市的表。工资和城市

148、的表。13.4.4 13.4.4 视图的定义视图的定义3.3.视图中的虚字段视图中的虚字段用一个查询来建立一个视图的用一个查询来建立一个视图的SELECTSELECT子句可子句可以包含算术表达式或函数,这些表达式或函以包含算术表达式或函数,这些表达式或函数与视图的其也字段一样对待,由于他们是数与视图的其也字段一样对待,由于他们是计算得来的,并不存储在表内,所以称为虚计算得来的,并不存储在表内,所以称为虚字段。字段。13.4.4 13.4.4 视图的定义视图的定义【13.5913.59】定义一个视图,它包含职工号、月工资和年】定义一个视图,它包含职工号、月工资和年工资工资3 3个字段。个字段。

149、CREATE VIEW W5 AS;CREATE VIEW W5 AS; SELECT SELECT 职工号职工号, ,工资工资 AS AS 月工资月工资, ,工资工资*12*12 AS AS 年工年工资资 FROM FROM 职工职工这里这里的的SELECTSELECT短语中利用短语中利用ASAS重新定义视图的字段名。重新定义视图的字段名。由于其中一字段是计算得来的,所以必须给出字段名。由于其中一字段是计算得来的,所以必须给出字段名。这里年工资是虚字段,它是由职工表的工资字段乘以这里年工资是虚字段,它是由职工表的工资字段乘以1212得到的得到的; ;而月工资就是职工表中的工资字段,由此可而月

150、工资就是职工表中的工资字段,由此可见,在视图中还可以重新命名字段名。见,在视图中还可以重新命名字段名。13.4.4 13.4.4 视图的定义视图的定义4.4.视图的删除视图的删除由于视图是从表中派生出来的,所以不存在由于视图是从表中派生出来的,所以不存在修改结构的问题,但是可以删除视图。修改结构的问题,但是可以删除视图。格式:格式:DROP VIEWDROP VIEW视图名视图名说明:上述命令与说明:上述命令与VFPVFP中删除视图的命令中删除视图的命令DELETE VIEW DELETE VIEW 视图名等价。视图名等价。13.4.4 13.4.4 视图的定义视图的定义【13.6013.60

151、】删除视图】删除视图 W4W4。 DROP VIEW W4 DROP VIEW W413.4.4 13.4.4 视图的定义视图的定义5.5.关于视图的说明关于视图的说明在在Visual FoxProVisual FoxPro中视图是可更新的,但是这种更中视图是可更新的,但是这种更新是否反映在基本表中则取决于视图更新属性的设新是否反映在基本表中则取决于视图更新属性的设置。在置。在Visual FoxProVisual FoxPro中视图有它特殊的概念和用中视图有它特殊的概念和用途,在关系数据库中,视图始终不真正含有数据,途,在关系数据库中,视图始终不真正含有数据,它总是原来表的一个窗口。所以,虽然视图可以像它总是原来表的一个窗口。所以,虽然视图可以像表一样进行各种查询,但是插入、更新和删除操作表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定的限制。在一般情况下,当一个在视图上却有一定的限制。在一般情况下,当一个视图是由单个表导出时可以进行插入和更新操作,视图是由单个表导出时可以进行插入和更新操作,但不能进行删除操作但不能进行删除操作; ;当视图是从多个表导出时,当视图是从多个表导出时,插入、更新和删除操作都不允许进行。这种限制是插入、更新和删除操作都不允许进行。这种限制是很必要的,它可以避免一些潜在问题的发生。很必要的,它可以避免一些潜在问题的发生。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号