《[其它考试]第五章 关系数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《[其它考试]第五章 关系数据库标准语言SQL.ppt(109页珍藏版)》请在三一办公上搜索。
1、1,第5章 关系数据库标准语言SQL,目 录,上一页,下一页,退 出,2,本 章 要 点,5.1SQL语言的特点5.2数据查询 5.3数据操纵5.4数据定义5.5数据管理,3,SQL是结构化查询语言(Structured Query Language)的缩写。可以说查询是SQL语言的重要组成部分,但不是全部,SQL还包含资料定义、资料操纵和数据控制功能等部分。SQL已经成为关系数据库的标准数据语言,所以现在所有的关系数据库管理系统都支持SQL。现在的Visual FoxPro当然在这方面更加完善。,5.1 SQL语言特点,4,1.SQL是一种一体化的语言,它包括了资料定义、资料查询、资料操纵和
2、数据控制等方面的功能,它可以完成数据库活动中的全部工作。2.SQL语言是一种高度非过程化的语言,它没有必要一步步地告诉计算机“如何”去做,而只需要描述清楚用户要“做什么”。3.SQL语言非常简洁。虽然SQL语言功能很强,但它只有为数不多的几条命令,表5.1给出了分类的命令动词。它们分别是:数据查询命令 select;数据定义命令CREATE、DROP、ALTER;数据操纵命令INSERT、UPDATE、DELETE;数据控制命令GRANT、REVOAE。另外SQL的语法也非常简单,它很接近英语自然语言,因此容易学习、掌握。,5.1 SQL语言特点,5,4.SQL语言可以直接以命令方式交互使用,
3、也可以嵌入到程序设计语言中以程序方式使用。现在很多数据库应用开发工具都将SQL语言直接融入到自身的语言之中,使用起来更方便,Visual ForPro就是如此。这些使用方式为用户提供了灵活的选择余地。此外,尽管SQL的使用方式不同,但SQL语言的语法基础是一致的。Visual ForPro在SQL方面支持资料定义、资料查询和资料操纵功能,但在具体实现方面也存在一些差异。另外,Visual ForPro自身在安全控制方面的缺陷,所以它没有提供数据控制功能。,5.1 SQL语言特点,6,5.2 查询功能,数据库中的数据很多时侯是为了查询的,因此,数据查询是数据库的核心操作。而在SQL语言中,查询语
4、言中有一条查询命令,即SELECT语句。,7,5.2.1(简单查询)基本查询语句【格式】SELECT ALL|DISTINCT FROM【功能】无条件查询。【说明】ALL:表示显示全部查询记录,包括重复记录。为缺省值 DISTINCT:表示显示无重复结果的记录。,8,例5.1 从职工关系中检索所有工资值。Select 工资,职工号 from 职工&将显示查询结果,9,例5.2 检索仓库关系中的所有元组(即所有记录)sele*from 仓库&*表示所有字段,10,带条件(WHERE)的简单查询语句,【格式】SELECT ALL|DISTINCT FROM WHERE【功能】从一个表中查询满足条件
5、的数据。【说明】由一系列用AND 或 OR 连接的条件表达式组成,条件表达式的格式可以是以下几种:,11,(1)。(2)。(3)ALL()(4)ANY|SOME()(5)NOT BETWEEN AND(6)NOT EXISTS()(7)NOT IN(8)NOT IN()(9)NOT LINK,12,SQL支持的关系运算符如下:、!、。例5.3 检索工资多于1230元的职工号sele 职工号,工资 from 职工 where 工资1230,13,例5.4 检索哪些有工资多于1210元的职工的仓库。Sele dist 仓库号 from 职工 where 工资1210,14,例5.5 给出在仓库WH
6、1或WH2工作,工资少于1250的职工号。sele 职工号,工资 from 职工 where 工资1250 and;(仓库号=WH1 or 仓库号=WH2),15,【说明】在一个数据库中的多个表之间一般都存在着某些联系,在一个查询语句中同时涉及到两个或两个以上的表时,这种查询称之为连接查询(也称为多表查询)。在多表之间查询必须处理表与表之间的连接关系。SELECT ALL|DISTINCT FROM,表2.WHERE,5.2.2 简单的联接查询,16,例5.6 找出工资多于1230元的职工号和他们所在的城市。这里所要查询的职工号和城市分别出自职工表和仓库表,此类查询一般用联接查询来实现。联接查
7、询必须有联接条件。Sele 职工号,城市 from 职工,仓库;Where(工资1230)and(职工.仓库号=仓库.仓库号),17,18,例5.7 找出工作在面积大于400的仓库的职工号以及职工工作所在的城市。Select 职工号,城市 FROM 职工,仓库 WHERE;(面积400)and(职工.仓库号=仓库.仓库号),19,5.2.3嵌套查询,另一类基于多个关系的查询,这类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。例 5.8 哪些城市至少有一个仓库的职工工资为1250元?要求查询仓库表中的城市信息,而查询条件是职工表中的工资字段值,因此可以使用嵌套查询来实现。Select
8、 城市 FROM 仓库 WHERE 仓库号 IN;(select 仓库号 FROM 职工 WHERE 工资=1250)在这个命令中有两个查询块,内层SELECT-FORM-WHERE查询块查询到的仓库号值是WH1和WH2,这样就等价于下面的命令:Select城市 FROM 仓库WHERE 仓库号IN(wh1,wh2)这里的IN相当于集合运算符。,20,21,例5.9 查询所有职工的工资都多于1210元的仓库的信息。或者说没有一个职工的工资少于或等于1210元的仓库的信息。Select*FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=1
9、210)内层SELECT-FORM-WHERE查询块指出所有职工的工资少于或等于1210元的仓库的仓库号值的集合,在这里该集合只有一个值“WH1”;然后从仓库关系中检索元组的仓库号属性值不在该集合中的每个元组。,22,23,如果要求排除那些还没有职工的仓库,检索要求可以叙述为:检索所以职工的工资都多于1210元仓库的信息,并且该仓库至少要有一名职工。Select*FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=1210);and 仓库号 IN(select 仓库号 FROM 职工),24,25,例5.10 找出和职工E4挣同样工资的所
10、有职工。Select 职工号 FROM 职工 WHERE 工资=;(Select 工资 FROM 职工 WHERE 职工号=E4),26,5.2.4 几个特殊运算符,在SQL SELECT中使用的几个特殊运算符,它们是BETWEENAND和LIKE等例5.11 检索出工资在1220元到1240元范围内的职工信息。Select*FROM 职工 WHERE 工资BETWEEN 1220 AND 1240,27,例5.12从供应商关系中检索出全部公司的信息。这个问题是一个字符串匹配的查询,可以使用LIKE运算符。Select*FROM 供应商 WHERE 供应商名 LIKE“%公司”,28,这里的L
11、IKE是一个字符串匹配运算符,通配符“%”表示0个或多个字符,通配符下划线“_”表示一个字符。,29,例5.13 找出不在北京的全部供应商信息。Select*FROM 供应商 WHERE 地址!=北京,30,5.2.5 排序,使用SQL SELECT可以将查询结果排序,排序的短语是ORDER BY.格式:ORDER BY Order_ItemASC DESC,Order_ItemASC DESC从中可以看出,可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。,31,例5.14按职工的工资升序检索出全部职工信息。Select*FROM 职工 ORDER BY 工资,32,例5.1
12、5先按仓库号排序,在按工资排序并输出全部职工信息。SELECT*FROM 职工 ORDER BY仓库号,工资,33,5.2.6 简单的计算查询,用于计算检索的函数有:COUNT记数SUM求和AVG计算平均值MAX求最大值MIN求最小值,34,例5.16找出供应商所在地的数目。SELECT COUNT(DISTINCT 地址)FROM 供应商 共有3个地址:北京、西安和郑州,所以结果为3。注意,除非对关系中的元组个数进行计数,一般COUNT函数应该使用DISTINCT。否则比如:SELECT COUNT(*)FROM供应商将给出供应商关系中的记录数(为4)。,35,例5.17 求支付的工资总数。
13、SELECT SUM(工资)FROM 职工结果是:6160这个结果是职工关系中的工资值的总和,它并不管是否有重复值。这时若使用命令:SELECT SUM(DISTINCT工资)FROM 职工将得出错误的结果4910。,36,例5.18 求北京和上海的仓库职工的工资总和。SELECT SUM(工资)FROM 职工 WHERE 仓库号IN;(SELECT 仓库号FROM 仓库 WHERE城市=”北京”OR城市=上海)结果是:4930,37,例5.19 求所有职工的工资都多于1210元的仓库的平均面积。SELECT AVG(面积)FROM仓库 WHERE仓库号NOT IN(SELECT 仓库号FRO
14、M 职工WHERE工资=1210)结果是:366.67这里要注意,以上结果的运算包含了尚没有职工的WH4仓库。如果要排除没有职工的仓库,以上语句应该改为:Select avg(面积)FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=1210);and 仓库号 IN(select 仓库号 FROM 职工)结果是:350,38,例5.20 求在WH2仓库工作的职工的最高工资值。SELECT MAX(工资)FROM 职工WHERE 仓库号=WH2结果是:1250与MAX函数相应的是MIN函数(求最小值)。比如,求最低工资值可以有如下命令:SE
15、LECT MIN(工资)FROM 职工WHERE仓库号=“WH2”,39,5.2.4 排序,在SQL中,可以使用ORDER BY短语将查询结果排序。其格式为:ORDER BY ASC|DESC,ASC|DESC例:按成绩由高到低排列学生信息。SELECT*FROM 成绩 ORDER BY 成绩 DESC,40,5.2.5 简单的计算查询,用于计算检索的函数:count-计数 sum-求和 avg-计算平均值 max-求最大值 min-求最小值例:求成绩总和。SELECT SUM(成绩)FROM 成绩,41,例5.16找出供应商所在地的数目。SELECT COUNT(DISTINCT 地址)FR
16、OM 供应商参见前面给出的供应商的记录值,其中共有3个地址:北京、西安和郑州,所以结果为3。注意,除非对关系中的元组个数进行计数,一般COUNT函数应该使用DISTINCT。否则比如:SELECT COUNT(*)FROM供应商将给出供应商关系中的记录数(为4)。,42,例5.17 求支付的工资总数。SELECT SUM(工资)FROM 职工结果是:6160这个结果是职工关系中的工资值的总和,它并不管是否有重复值。这时若使用命令:SELECT SUM(DISTINCT工资)FROM 职工表将得出错误的结果4910。,43,例5.18 求北京和上海的仓库职工的工资总和。SELECT SUM(工资
17、)FROM 职工 WHERE 仓库号IN;(SELECT 仓库号FROM 仓库 WHERE城市=”北京”OR城市=上海)结果是:4930,44,例5.19 求所有职工的工资都多于1210元的仓库的平均面积。SELECT AVG(面积)FROM仓库 WHERE仓库号NOT IN(SELECT 仓库号FROM 职工WHERE工资=1210)结果是:366.67这里要注意,以上结果的运算包含了尚没有职工的WH4仓库。如果要排除没有职工的仓库,以上语句应该改为:Select avg(面积)FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=121
18、0);and 仓库号 IN(select 仓库号 FROM 职工)结果是:350,45,例5.20 求在WH2仓库工作的职工的最高工资值。SELECT MAX(工资)FROM 职工WHERE 仓库号=WH2结果是:1250与MAX函数相应的是MIN函数(求最小值)。比如,求最低工资值可以有如下命令:SELECT MIN(工资)FROM 职工WHERE仓库号=“WH2”,46,5.2.7 分组与计算查询,GROUP BY短语的格式如下:GROUP BY GroupColumn,GroupColumnHAVING FilterCondition 可以按一列或多列分组,还可以用HAVING进一步限定
19、分组的条件。下面是几个分组计算查询的例子,47,例521 求每个仓库的职工的平均工资。SELECT 仓库号,AVG(工资)FROM 职工表GROUP BY 仓库号 结果是:WH1 1230WH2 1235WH3 1230在这个查询中,首先按仓库号属性进行分组,然后再计算每个仓库的平均工资。GROUPBY子句一般跟在WHERE子句之后,没有WHERE子句时,跟在FROM子句之后。另外,还可以根据多个属性进行分组。,48,例522求至少有两个职工的每个仓库的平均工资。SELECT 仓库号,COUNT(*),AvG(工资)FROM 职工;GROUP BY 仓库号 HAVING COUNT(*)=2结
20、果是:WH1 2 1230WH2 2 1235HAVING子句总是跟在GROUP BY子句之后,不可以单独使用。HAVING子句和WHERE子句不矛盾,在查询中是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。,49,5.2.8 利用空值查询,例523 找出尚未确定供应商的订购单SELECT*FROM 订购单表 WHERE 供应商号 IS NULL结果是:E6 NULL OR77 NULLE1 NULL OR80 NULLE3 NULL OR90 NULL注意:查询空值时要使用IS NULL,而=NULL是无效的,因此空值不是一个确定的值,所以不能用“=”这样的运算
21、符进行比较。,50,例524 列出已经确定了供应商的订购单信息。SELECT*FROM订购单表WHERE 供应商号IS NOT NULL结果是:E3 S7 OR67 2001/06/23E1 S4 OR73 2001/07/28 E7 S4 OR76 2001/05/25E3 S4 OR79 2001/06/13E3 S3 OR91 2001/07/13,51,52,5.2.9 别名与自联接查询,SQL允许在FROM短语中为关系名定义别名格式为:关系名别名 SELECT供应商名 FORM供应商表,订购单表,职工表,仓库表;WHERE 地址=“北京”AND 城市=“北京”;AND 供应商表.供应
22、商号=订购单表.供应商号;AND订购单表.职工号=职工表.职工号;AND 职工表.仓库号=仓库表.仓库号,53,SELECT 供应商名 RROM供应商 S,订购单P,职工E,仓库W;WHERE 地址=“北京”AND=城市=:“北京”;AND S.供应商号=P.供应商号;AND P职工号=E.职工号;AND E.仓库号=W.仓库号,54,5.2.10内外层互相关嵌套查询,有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询结果。例5.26 列出每个职工经手的具有最高总金额的订购单信息。这里先给出相应的查询语句,然后在作必要的解释。SELECT out
23、.职工号,out.供应商号,out.订购单号,out.订购日期,out.总金额;FROM 订购单表 out WHERE 总金额=;(SELECT MAX(总金额)FROM 订购单表 inner1;WHERE out.职工号=inner1.职工号),55,56,5.2.11 使用量词和谓词的查询,和嵌套查询或子查询有关的IN和NOT IN运算符,除此之外还有两类和子查询有关的运算符,它们有以下两种形式:ANY|ALL|SOME(子查询)NOTEXISTS(子查询),57,ANY、ALL和SOME是量词,其中ANY和SOME是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果就为真;而
24、ALL则要求子查询中的所有行都使结果为真时,结果才为真。EXISTS是谓词,EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回,即存在元组或不存在元组。,58,例5.27 检索那些仓库中还没有职工的仓库的信息。这里的查询是没有职工或不存在职工,所以可以使用谓词NOT EXISTS:SELECT*FROM仓库 WHERE NOT EXISTS;(SELECT*FROM职工 WHERE仓库号=仓库.仓库号)注意:这里的内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOT EXISTS才有意义。所以这类查询也都是内、外层互相嵌套查询。以上的查询等价于:SELECT*FR
25、OM仓库 WHERE仓库号 NOT IN;(SELECT 仓库号 FROM 职工)结果是:WH4 武汉 400,59,例5.28 检索那些仓库中至少已经有一个职工的仓库的信息。SELECT*FROM仓库表WHERE EXISTS;(SELECT*FROM职工表WHERE 仓库号=仓库.仓库号)它等价于:SELECT*FROM 仓库表 WHERE 仓库号 IN;(SELECT 仓库号 FROM 职工表)结果是:WH1 北京 370WH2 上海 500WH3 广州 200注意:NOTEXISTS只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较。,60,例5.29 检索有职工的工资大
26、于或等于WH1仓库中任何一名职工工资的仓库号。这个查询可以使用ANY或SOME量词。SELECT DISTINCT 仓库号FRoM职工表WHERE 工资=ANY;(SELECT 工资FRoM 职工表WHERE仓库号=“WH1”)它等价于:SELECT DISTINCT 仓库号FRoM职工表WHERE工资=;(SELECT MIN(工资)FROM职工表WHERE 仓库号=“WH1”)结果是:WH1 WH2 WH3,61,例5.30检索有职工的工资大于或等于WH1仓库中所有职工工资的仓库号。这个查询使用ALL量词。SELECT DIST 仓库号FROM 职工表WHERE工资=ALL;(SELECT
27、 工资 FROM 职工表WHERE 仓库号=WH1)它等价于:SELECT DISTINCT仓库号FROM职工表WHERE工资=;(SELECT MAX(工资)FROM职工表WHERE仓库号=WH1)结果是:WH1 WH2,62,5212超联接查询,在新的SQL标准中还支持两个新的关系联接运算符,它们与我们原来所了解的等值联接和自然联接不同。原来的联接上只有满足联接条件,相应的结果才会出现在结果表中;而这两个新的联接运算是,首先保证一个表中满足条件的元组都在结果表中,然后将满足联接条件的元组与另一个表的元组进行联接,不满足联接条件的则应将来自另一表的属性值置为空值。在一般SQL中超联接运算符是
28、“*=”和“=*”。其中“*=”称为左联接。含义是在结果表中包含第一个表中满足条件的所有记录;如果有在联接条件上匹配的元组,则第二个表返回相应值,否则第二个表返回空值;而“=*”称为右联接,含义是在结果表中包含第二个表中满足条件的所有记录;如果有在联接条件上匹配的元组,则第一个表返回相应值,否则第一个表返回空值。,63,语法格式如下:SELECTFORM Table INNER|LEFT|RIGHT|FULL JOIN TableON Join ConditionWHERE 其中:INNER JOIN等价于JOIN,为普通的联接,在Visual ForPro中称为内部联接。LEFT JOIN为
29、左联接RIGHT JOIN为右联接FULL JOIN可以称为全联接,即两个表中的记录不管是否满足联接条件将都在目标表或查询结果中出现,不满足联接条件的记录对应部分为NULL。ON JoinCondition指定联接条件。从以上格式可以看出,它的联接条件在ON短语中给出,而不在WHERE短语中,联接类型在FORM短语中给出,64,例531内部联接,即只有满足联接条件的记录才出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表 JOIN 职工表;ON 仓库表.仓库号=职工表.仓库号&是内联接,65,66,如下两种命令格式也是等价的:SELECT 仓库表.仓库号,
30、城市,面积,职工号,工资;FROM 仓库表 INNER JOIN 职工表;ON 仓库表.仓库号=职工表.仓库号 WHERE 仓库表.仓库号=职工表.仓库号&是简单联接查询以上三种联接语句的结果都是一样的。,67,例532左联接,即除满足联接条件的记录出现在查询结果中外,第一个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表 LEFT JOIN 职工表;ON 仓库表.仓库号=职工表.仓库号,68,69,为了看到右联接和全联接的效果,假设在职工表中插入了如下一条记录:“WH8”,“E8”,1200例5.33 右联接,即除满足联接条件
31、的记录出现在查询结果中外,第二个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表RIGHT JOIN 职工表;ON 仓库表.仓库号=职工表.仓库号,70,71,例5.34全联接,即除满足联接条件的记录出现在查询结果中外,两个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表FULL JOIN 职工表;ON 仓库表.仓库号=职工表.仓库号,72,73,注意:Visual FoxPro的SQL SELECT 语句的联接格式只能实现两个表的联接,如果要实现多个表的联接,还
32、需要使用标准格式。例如下面是一个基于4个关系的联接查询(用简单联接)SELECT 仓库表.仓库号,城市,供应商名,地址;FROM 供应商表,订购单表,职工表,仓库表;WHERE 供应商表.供应商号=订购单表.供应商号;AND 订购单表.职工号=职工表.职工号;AND 职工表.仓库号=仓库表.仓库号,74,75,5.2.13 集合并运算,SQP 支持集合的并(UNION)运算,即可以将两个SELECT语句的查询结果通过并运算合度成一个查询结果。为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应字段的值要出自一个值同一个值域,即具有相同的数据类型的取值范围。例如:如下语句的结果是城
33、市为北京和上海的仓库信息SELECT*FROM仓库表WHERE城市=北京;UNION;SELECT*FROM仓库表 WHERE城市=上海,76,77,5.2.14 Visual ForPro中SQL SELECT的几个特殊选项,1.显示部分结果例5.35 只显示前几项记录。有时只需要满足条件的前几个记录,这时使用TOP nExpr PERCENT短语非常有用,其中nExpr是数字表达式,当不使用PERCENT时,nExpr是1至32 767间的整数,说明显示前几个记录:当使用PERCENT时,nExpr是0.01至99.99间的实数,说明显示结果中前百分之几的记录。需要注意的是TOP短语要与O
34、RDER BY短语同时使用才有效。,78,例5.36显示工资最高的三位职工的信息。SELECT*TOP 3 FROM职工表ORDER BY 工资DESC结果是:WH2 E4 1250WH1 E7 1250WH3 E6 1230,79,例5.37显示工资最低的那30%职工的信息。SELECT*TOP 30 PERCENT FROM 职工表ORDER BY 工资结果是:WH5 E8 1200WH1 E3 1210,80,2.将查询结果存放在数组中可以使用INTO ARRAY ArrayName短语将查询结果存放到数组中。ArrayName可以是任意的数组变量名。一般将存放查询结果的数组作为二维数组
35、来使用,每行一条记录,每列对应于查询结果的一列。查询结果存放在数组中,可以非常方便地在程序中使用。,81,例如,下语句将查询到的职工信息存放在数组tmp中;然后用 list memo like tmp命令将数组内容显示出来。SELECT*FROM职工表INTO ARRAY tmp其中:Tmp(1,1)存放的是第一条记录的仓库号字段值,tem(1,3)存放的是第一条记录的工资字段值等。,82,其中:Tmp(1,1)存放的是第一条记录的仓库号字段值,tem(1,3)存放的是第一条记录的工资字段值等。,83,3.将查询结果存放在临时文件中使用短语INTO CURSOR CursorName可以将查询
36、结果存放到临时数据库文件中,其中CursorName是临时文件名,该短语产生的临时文件是一个只读的dbf文件,当查询结束后该临时文件是当前文件,可以像一般的dbf文件一样使用,但仅是只读。当关闭文件时该文件将自动删除。例如:如下语句将查询到的职工信息存放在临时dbf文件tem中。SELECT*FROM职工表INTO CURSOR temList(可用list 命令将临时dbf文件tem显示出来),84,一般利用INTO CURSOR短语存放一些临时结果,比如一些复杂的汇总可能需要分阶段完成,需要根据几个中间结果再汇总等,这时利用该短语存放中间结果就非常适合,当使用完成后这些临时文件会自动删除。
37、,85,4.将查询结果存放到永久表中使用短语INTO DBF TABLE TableName可以将查询结果存放到永久表中(dbf文件)。比如将,例5.36显示工资最高的三位职工的信息的查询结果存放在表highsal中SELECT*TOP 3 FRoM 职工表 INTO TABLE highsal ORDER BY 工资 DESCLIST:(highsal.dbf),86,87,5.将查询结果存放到文本文件中使用短语TO FILE FileName ADDITIVE可以将查询结果存放到文本文件中,其中FileName给出了文本文件名(默认扩展名是txt),如果使用ADDITIVE结果将追加在原文
38、件的尾部,否则将覆盖原有文件。如下语句将查询结果以文本的形式存储在文本文件tem.txt中:SELECT*TOP 3 FROM 职工表 TO FILE tem ORDER BY 工资 DESC,88,89,6.将查询结果直接输出到打印机使用短语TO PRINTER PROMPT可以直接将查询结果输出到打印机,如果使用了PROMPT选项,在开始打印之前会打开打印机设置对话框。,90,5.3 操作功能,5.3.1 插入标准格式:insert into dbf_name(fname1,fname2,.)values(expression1,expression2,.)VF特殊格式:insert in
39、to dbf_name from array arrayname|from memvar,91,insert into 订购单(职工号,订购单号)values(e7,or01)insert into 订购单 values(E7,S4,OR01,2001-05-25,42000),92,use 订购单SCATTER TO ARR1COPY STRUCTURE TO ORD2INSERT INTO ORD2 FROM ARRAY ARR1SELECT ORD2BROWSEUSEDELETE FILE ORD2.DBF,93,USE 订购单SCATTER MEMVARCOPY STRUCTURE T
40、O ORD2INSERT INTO ORD2 FROM MEMVARSELECT ORD2BROWSEUSEDELETE FILE ORD2.DBF,94,5.3.2 更新命令格式:update tablename set column_name1=expression1,column_name2=expression2.where condition实例:update 职工 set 工资=工资*1.10 where 仓库号=WH1update 学生 set 年龄=年龄+1,95,5.3.3 删除命令格式:delete from tablename where condition实例:dele
41、te from 仓库 where 仓库号=WH2注意:在VF中,SQL DELETE命令仍是逻辑删除记录,如要物理删除需继续使用PACK命令。,96,5.4 定义功能,5.4.1 表的定义命令格式:create table|dbf tablename1 name longtablename free(fieldname1 fieldtype(fieldwidth,precision)null|not null check lexpression1error cmessagetext1 default expression1 primary key|unique references table
42、name2 tag tagname1 nocptrans,fieldname2.,primarykey key expression2 tag tagname2|,unique expression3 tag tagname3,foreign key expression4 tag tagname4nodup references tablename3tag tagname5,check lexpression2 error cmessagetext2)|from array arrayname,97,create table 仓库1(仓库号 c(5)primary key,城市 c(10),
43、面积 i check(面积0)error“面积应该大于0!”)create table 职工1(仓库号 c(5),职工号 c(5)primary key,工资 i check(工资=1000 and 工资=5000)error 工资值的范围在1000-5000!default 1200,foreign key 仓库号 tag 仓库号 references 仓库1),98,create table 供应商1(供应商号 c(5)primary key,供应商名 c(20),地址 c(20)create table 订购单1(职工号 c(5),供应商号 c(5),订购单号 c(5)primary k
44、ey,订购日期 d,foreign key 职工号 tag 职工号 references 职工1,foreign key 供应商号 tag 供应商号 references 供应商1),99,5.4.2 表的删除命令格式:drop table table_name注意:该命令是直接从磁盘上删除table_name所对应的文件。如果table_name是数据库表,则需先打开数据库再删除表,否则表虽从磁盘中删除掉了,但其记录在数据库文件中的信息却没有删除,此后会出现错误提示。,100,5.4.3 表结构的修改命令格式1:alter table tablename1 add|alter column
45、fieldname1 fieldtype(nfieldwidth,nprecision)null|not null check lexpression1 error cmessagetext1 default expression1 primary key|unique references tablename2tag tagname1实例:alter table 订购单1 add 总金额 y check 总金额0 error 总金额应该大于0!alter table 订购单1 alter 订购单号 c(6),101,命令格式2:alter table tablename1 alter col
46、umn fieldname2 null|not null set default expression2 set check lexpression2 error cmessagetext2 drop default drop check实例:alter table 订购单1 alter 总金额 set check 总金额 100 error 总金额应该大于100!alter table 订购单1 alter 总金额 drop check,102,命令格式3:alter table tablename1 drop column fieldname3 set check lexpression3
47、 error cmessagetext3 drop checkadd primary key expression3 tag tagname2 for lexpression4 drop primary key add unique expression4 tag tagname3 for lexpression5 drop unique tag tagname4 add foreign key expression5 tag tagname4 for expression6 references tablename2 tag tagname5 drop foreign key tag tag
48、name6 save rename column fieldname4 to fieldname5,103,实例:alter table 订购单1 rename column 总金额 to 金额 alter table 订购单1 drop column 金额 alter table 订购单1 add unique 职工号+供应商号 tag emp_sup alter table 订购单1 drop unique tag emp_sup,104,5.4.4 视图的定义 在VF中视图是一个定制的虚拟表,他可以是本地的、远程的或带参数的。他可引用一个或多个表,或者引用其他视图。命令格式:create
49、 view view_name(column_name,column_name.)as select_statement,105,从单个表派生出的视图 create view e_w as select 职工号,仓库号 from 职工create view v_bj as select 仓库号,面积 from 仓库 where 城市=北京,106,从多个表派生出的视图 create view v_sample as select out.职工号,out.供应商号,out.订购单号,out.订购日期,out.总金额 from 订购单 out where=(select max(总金额)from
50、订购单 inner1 where out.职工号=inner1.职工号)create view v_sample as select 职工号,工资,城市 from 职工,仓库 where 职工.仓库号=仓库.仓库号,107,视图中的虚字段 create view v_sal as select 职工号,工资 as 月工资,工资*12 as 年工资 from 职工视图的删除 drop view 关于视图的说明 在关系数据库中,视图始终不真正含有数据,它总是原表的一个窗口。所以虽然视图可以象表一样进行各种查询,但插入、更新和删除操作在视图上却有一定限制。当视图是由单个表导出时可以进行插入和更新操作