[其它考试]第五章 关系数据库标准语言SQL

上传人:仙*** 文档编号:41241354 上传时间:2021-11-19 格式:PPT 页数:109 大小:592.50KB
返回 下载 相关 举报
[其它考试]第五章 关系数据库标准语言SQL_第1页
第1页 / 共109页
[其它考试]第五章 关系数据库标准语言SQL_第2页
第2页 / 共109页
[其它考试]第五章 关系数据库标准语言SQL_第3页
第3页 / 共109页
点击查看更多>>
资源描述
1目 录上一页下一页退 出2本本 章章 要要 点点5.1SQL语言的特点语言的特点5.2数据查询数据查询 5.3数据操纵数据操纵5.4数据定义数据定义5.5数据管理数据管理3vSQL是结构化查询语言(Structured Query Language)的缩写。可以说查询是SQL语言的重要组成部分,但不是全部,SQL还包含资料定义、资料操纵和数据控制功能等部分。SQL已经成为关系数据库的标准数据语言,所以现在所有的关系数据库管理系统都支持SQL。现在的Visual FoxPro当然在这方面更加完善。5.1 SQL语言特点语言特点4v1.SQL是一种一体化的语言,它包括了资料定义、资料查询、资料操纵和数据控制等方面的功能,它可以完成数据库活动中的全部工作。 v2.SQL语言是一种高度非过程化的语言,它没有必要一步步地告诉计算机“如何”去做,而只需要描述清楚用户要“做什么”。v3.SQL语言非常简洁。虽然SQL语言功能很强,但它只有为数不多的几条命令,表5.1给出了分类的命令动词。它们分别是:数据查询命令 select;数据定义命令CREATE、DROP、ALTER;数据操纵命令INSERT、UPDATE、DELETE;数据控制命令GRANT、REVOAE。另外SQL的语法也非常简单,它很接近英语自然语言,因此容易学习、掌握。5.1 SQL语言特点语言特点5v4.SQL语言可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。现在很多数据库应用开发工具都将SQL语言直接融入到自身的语言之中,使用起来更方便,Visual ForPro就是如此。这些使用方式为用户提供了灵活的选择余地。此外,尽管SQL的使用方式不同,但SQL语言的语法基础是一致的。 vVisual ForPro在SQL方面支持资料定义、资料查询和资料操纵功能,但在具体实现方面也存在一些差异。另外,Visual ForPro自身在安全控制方面的缺陷,所以它没有提供数据控制功能。5.1 SQL语言特点语言特点65.2 查询功能查询功能 数据库中的数据很多时侯是为了查询的,因此,数据查询是数据库的核心操作。而在SQL语言中,查询语言中有一条查询命令,即SELECT语句。75.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 【功能】从一个表中查询满足条件的数【功能】从一个表中查询满足条件的数据。据。【说明】【说明】由一系列用由一系列用AND 或或 OR 连接的条件表达式组成,条件连接的条件表达式组成,条件表达式的格式可以是以下几种:表达式的格式可以是以下几种: 11(1 1) 2。(2 2) 。(3 3) ALLALL( )(4 4) ANY | SOME ANY | SOME ( )(5 5) NOT BETWEEN NOT BETWEEN AND AND (6 6)NOT EXISTS NOT EXISTS ( )(7 7) NOT IN NOT IN (8 8) NOT IN NOT IN ( )(9 9) NOT LINK NOT LINK 12SQL支持的关系运算符如下:支持的关系运算符如下:、!、。、!、。例例5.3 检索工资多于检索工资多于1230元的职工号元的职工号sele 职工号职工号, 工资工资 from 职工职工 where 工资工资123013例例5.4 检索哪些有工资多于检索哪些有工资多于1210元的职工的仓库。元的职工的仓库。Sele dist 仓库号仓库号 from 职工职工 where 工资工资121014例5.5 给出在仓库WH1或WH2工作,工资少于1250的职工号。sele 职工号,工资 from 职工 where 工资1250 and;(仓库号= WH1 or 仓库号=WH2 )15【说明】在一个数据库中的多个表之间【说明】在一个数据库中的多个表之间一般都存在着某些联系,在一个查询一般都存在着某些联系,在一个查询语句中同时涉及到两个或两个以上的语句中同时涉及到两个或两个以上的表时,这种查询称之为连接查询(也表时,这种查询称之为连接查询(也称为多表查询)。在多表之间查询必称为多表查询)。在多表之间查询必须处理表与表之间的连接关系。须处理表与表之间的连接关系。 SELECT ALL | DISTINCT FROM ,表,表2. WHERE 5.2.2 简单的联接查询简单的联接查询16例例5.6 找出工资多于找出工资多于1230元的职工号和他们所在的城市。元的职工号和他们所在的城市。 这里所要查询的职工号和城市分别出自职工表和仓库表,此这里所要查询的职工号和城市分别出自职工表和仓库表,此类查询一般用联接查询来实现。联接查询类查询一般用联接查询来实现。联接查询必须有联接条件必须有联接条件。 Sele 职工号职工号, 城市城市 from 职工职工,仓库仓库; Where (工资工资1230) and (职工职工.仓库号仓库号=仓库仓库.仓库号仓库号) 1718例5.7 找出工作在面积大于400的仓库的职工号以及职工工作所在的城市。 Select 职工号,城市 FROM 职工,仓库 WHERE ;(面积400) and (职工.仓库号=仓库.仓库号)195.2.3嵌套查询嵌套查询 另一类基于多个关系的查询,这类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。 例 5.8 哪些城市至少有一个仓库的职工工资为1250元? 要求查询仓库表中的城市信息,而查询条件是职工表中的工资字段值,因此可以使用嵌套查询来实现。 Select 城市 FROM 仓库 WHERE 仓库号 IN;(select 仓库号 FROM 职工 WHERE 工资=1250)在这个命令中有两个查询块,内层SELECT-FORM-WHERE查询块查询到的仓库号值是WH1和WH2,这样就等价于下面的命令: Select城市 FROM 仓库WHERE 仓库号IN (wh1,wh2)这里的IN相当于集合运算符。 2021例5.9 查询所有职工的工资都多于1210元的仓库的信息。或者说没有一个职工的工资少于或等于1210元的仓库的信息。 Select * FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=1210)内层SELECT-FORM-WHERE查询块指出所有职工的工资少于或等于1210元的仓库的仓库号值的集合,在这里该集合只有一个值“WH1”;然后从仓库关系中检索元组的仓库号属性值不在该集合中的每个元组。2223如果要求排除那些还没有职工的仓库,检索如果要求排除那些还没有职工的仓库,检索要求可以叙述为:检索所以职工的工资都要求可以叙述为:检索所以职工的工资都多于多于1210元仓库的信息,并且该仓库至少元仓库的信息,并且该仓库至少要有一名职工。要有一名职工。 Select * FROM 仓库仓库 WHERE 仓库号仓库号 not IN;(select 仓库号仓库号 FROM 职工职工 WHERE 工资工资=1210);and 仓库号仓库号 IN (select 仓库号仓库号 FROM 职工职工)2425例例5.10 找出和职工找出和职工E4挣同样工资的所有职工。挣同样工资的所有职工。Select 职工号职工号 FROM 职工职工 WHERE 工资工资=;(Select 工资工资 FROM 职工职工 WHERE 职工号职工号=E4)265.2.4 几个特殊运算符几个特殊运算符v在SQL SELECT中使用的几个特殊运算符,它们是BETWEENAND和LIKE等v例5.11 检索出工资在1220元到1240元范围内的职工信息。vSelect * FROM 职工 WHERE 工资BETWEEN 1220 AND 1240 27v例5.12从供应商关系中检索出全部公司的信息。这个问题是一个字符串匹配的查询,可以使用LIKE运算符。v Select * FROM 供应商 WHERE 供应商名 LIKE “%公司”28v这里的LIKE是一个字符串匹配运算符,通配符“%”表示0个或多个字符,通配符下划线“_”表示一个字符。 29v例5.13 找出不在北京的全部供应商信息。vSelect * FROM 供应商 WHERE 地址!=北京305.2.5 排序排序v使用SQL SELECT可以将查询结果排序,排序的短语是ORDER BY.v格式:ORDER BY Order_ItemASC DESC,Order_ItemASC DESCv从中可以看出,可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。 31v例5.14按职工的工资升序检索出全部职工信息。vSelect * FROM 职工 ORDER BY 工资32v例5.15先按仓库号排序,在按工资排序并输出全部职工信息。vSELECT * FROM 职工 ORDER BY仓库号,工资335.2.6 简单的计算查询简单的计算查询用于计算检索的函数有:vCOUNT记数vSUM求和vAVG计算平均值vMAX求最大值vMIN求最小值34v例5.16找出供应商所在地的数目。vSELECT COUNT (DISTINCT 地址)FROM 供应商 v共有3个地址:北京、西安和郑州,所以结果为3。注意,除非对关系中的元组个数进行计数,一般COUNT函数应该使用DISTINCT。v否则比如:SELECT COUNT(*)FROM供应商v将给出供应商关系中的记录数(为4)。35v例5.17 求支付的工资总数。vSELECT SUM(工资) FROM 职工v结果是:6160v这个结果是职工关系中的工资值的总和,它并不管是否有重复值。这时若使用命令:vSELECT SUM(DISTINCT工资)FROM 职工v将得出错误的结果4910。 36v例5.18 求北京和上海的仓库职工的工资总和。vSELECT SUM(工资) FROM 职工 WHERE 仓库号IN;(SELECT 仓库号FROM 仓库 WHERE城市=”北京” OR城市=上海)v结果是:493037v例5.19 求所有职工的工资都多于1210元的仓库的平均面积。vSELECT AVG(面积) FROM仓库 WHERE仓库号NOT IN (SELECT 仓库号FROM 职工WHERE工资=1210)v结果是:366.67v这里要注意,以上结果的运算包含了尚没有职工的WH4仓库。如果要排除没有职工的仓库,以上语句应该改为:vSelect avg(面积) FROM 仓库 WHERE 仓库号 not IN;(select 仓库号 FROM 职工 WHERE 工资=1210);and 仓库号 IN (select 仓库号 FROM 职工)v结果是:35038v例5.20 求在WH2仓库工作的职工的最高工资值。vSELECT MAX(工资) FROM 职工WHERE 仓库号=WH2v结果是:1250v与MAX函数相应的是MIN函数(求最小值)。比如,求最低工资值可以有如下命令:vSELECT MIN(工资)FROM 职工WHERE仓库号=“WH2”395.2.4 5.2.4 排序排序 在SQL中,可以使用ORDER BY短语将查询结果排序。其格式为:ORDER BY ASC | DESC , ASC | DESC例 :按成绩由高到低排列学生信息。SELECT * FROM 成绩 ORDER BY 成绩 DESC405.2.5 简单的计算查询用于计算检索的函数:用于计算检索的函数: count-计数计数 sum-求和求和 avg-计算平均值计算平均值 max-求最大值求最大值 min-求最小值求最小值例:求成绩总和。例:求成绩总和。SELECT SUM( 成绩成绩) FROM 成绩成绩41v例5.16找出供应商所在地的数目。vSELECT COUNT (DISTINCT 地址)FROM 供应商v参见前面给出的供应商的记录值,其中共有3个地址:北京、西安和郑州,所以结果为3。注意,除非对关系中的元组个数进行计数,一般COUNT函数应该使用DISTINCT。v否则比如:SELECT COUNT(*)FROM供应商v将给出供应商关系中的记录数(为4)。42v例5.17 求支付的工资总数。vSELECT SUM(工资) FROM 职工v结果是:6160v这个结果是职工关系中的工资值的总和,它并不管是否有重复值。这时若使用命令:vSELECT SUM(DISTINCT工资)FROM 职工表v将得出错误的结果4910。 43v例5.18 求北京和上海的仓库职工的工资总和。SELECT SUM(工资) FROM 职工 WHERE 仓库号IN;(SELECT 仓库号FROM 仓库 WHERE城市=”北京” OR城市=上海)v结果是:493044v例5.19 求所有职工的工资都多于1210元的仓库的平均面积。vSELECT AVG(面积) FROM仓库 WHERE仓库号NOT IN (SELECT 仓库号FROM 职工WHERE工资=1210)v结果是:366.67v这里要注意,以上结果的运算包含了尚没有职工的WH4仓库。如果要排除没有职工的仓库,以上语句应该改为:vSelect avg(面积) FROM 仓库 WHERE 仓库号 not IN;v(select 仓库号 FROM 职工 WHERE 工资=2结果是:WH1 2 1230WH2 2 1235HAVING子句总是跟在GROUP BY子句之后,不可以单独使用。HAVING子句和WHERE子句不矛盾,在查询中是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。 495.2.8 利用空值查询利用空值查询例523 找出尚未确定供应商的订购单SELECT*FROM 订购单表 WHERE 供应商号 IS NULL结果是:E6 NULL OR77 NULLE1 NULL OR80 NULLE3 NULL OR90 NULL注意注意:查询空值时要使用IS NULL,而=NULL是无效的,因此空值不是一个确定的值,所以不能用“=”这样的运算符进行比较。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/1351525.2.9 别名与自联接查询别名与自联接查询SQL允许在FROM短语中为关系名定义别名格式为:关系名别名 SELECT供应商名 FORM供应商表,订购单表,职工表,仓库表;WHERE 地址=“北京”AND 城市=“北京”; AND 供应商表.供应商号=订购单表.供应商号; AND订购单表.职工号=职工表.职工号; AND 职工表.仓库号=仓库表.仓库号53SELECT 供应商名 RROM供应商 S,订购单P,职工E,仓库W;WHERE 地址=“北京”AND=城市=:“北京”;AND S.供应商号=P.供应商号;AND P职工号=E.职工号; AND E.仓库号=W.仓库号545.2.10内外层互相关嵌套查询内外层互相关嵌套查询有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询结果。例5.26 列出每个职工经手的具有最高总金额的订购单信息。这里先给出相应的查询语句,然后在作必要的解释。SELECT out.职工号,out.供应商号,out.订购单号,out.订购日期, out.总金额;FROM 订购单表 out WHERE 总金额=;(SELECT MAX(总金额) FROM 订购单表 inner1;WHERE out .职工号=inner1.职工号)55565.2.11 使用量词和谓词的查询使用量词和谓词的查询和嵌套查询或子查询有关的IN和NOT IN运算符,除此之外还有两类和子查询有关的运算符,它们有以下两种形式:ANY| ALL| SOME(子查询)NOTEXISTS(子查询)57vANY、ALL和SOME是量词,其中ANY和SOME是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果就为真;而ALL则要求子查询中的所有行都使结果为真时,结果才为真。vEXISTS是谓词,EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回,即存在元组或不存在元组。58例5.27 检索那些仓库中还没有职工的仓库的信息。这里的查询是没有职工或不存在职工,所以可以使用谓词NOT EXISTS:SELECT* FROM仓库 WHERE NOT EXISTS;(SELECT*FROM职工 WHERE仓库号=仓库.仓库号)注意:这里的内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOT EXISTS才有意义。所以这类查询也都是内、外层互相嵌套查询。以上的查询等价于:SELECT*FROM仓库 WHERE仓库号 NOT IN;(SELECT 仓库号 FROM 职工)结果是: WH4 武汉 40059例5.28 检索那些仓库中至少已经有一个职工的仓库的信息。SELECT*FROM仓库表WHERE EXISTS;(SELECT*FROM职工表WHERE 仓库号=仓库.仓库号)它等价于: SELECT*FROM 仓库表 WHERE 仓库号 IN;(SELECT 仓库号 FROM 职工表)结果是:WH1 北京 370WH2 上海 500WH3 广州 200注意:NOTEXISTS只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较。60例5.29 检索有职工的工资大于或等于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 工资 FROM 职工表WHERE 仓库号=WH1)它等价于:SELECT DISTINCT仓库号FROM职工表WHERE工资=;(SELECT MAX(工资)FROM职工表WHERE仓库号=WH1)结果是: WH1 WH2625212超联接查询超联接查询v在新的SQL标准中还支持两个新的关系联接运算符,它们与我们原来所了解的等值联接和自然联接不同。原来的联接上只有满足联接条件,相应的结果才会出现在结果表中;而这两个新的联接运算是,首先保证一个表中满足条件的元组都在结果表中,然后将满足联接条件的元组与另一个表的元组进行联接,不满足联接条件的则应将来自另一表的属性值置为空值。v在一般SQL中超联接运算符是“*=”和“=*”。其中“*=”称为左联接。含义是在结果表中包含第一个表中满足条件的所有记录;如果有在联接条件上匹配的元组,则第二个表返回相应值,否则第二个表返回空值;而“=*”称为右联接,含义是在结果表中包含第二个表中满足条件的所有记录;如果有在联接条件上匹配的元组,则第一个表返回相应值,否则第一个表返回空值。63v语法格式如下:vSELECTvFORM Table INNER| LEFT| RIGHT| FULL JOIN TablevON Join ConditionvWHERE 其中:vINNER JOIN等价于JOIN,为普通的联接,在Visual ForPro中称为内部联接。vLEFT JOIN为左联接vRIGHT JOIN为右联接vFULL JOIN可以称为全联接,即两个表中的记录不管是否满足联接条件将都在目标表或查询结果中出现,不满足联接条件的记录对应部分为NULL。vON JoinCondition指定联接条件。v从以上格式可以看出,它的联接条件在ON短语中给出,而不在WHERE短语中,联接类型在FORM短语中给出 64例531内部联接,即只有满足联接条件的记录才出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表 JOIN 职工表 ;ON 仓库表.仓库号=职工表.仓库号 &是内联接6566如下两种命令格式也是等价的:SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM 仓库表 INNER JOIN 职工表 ;ON 仓库表.仓库号=职工表.仓库号 &是普通联接或内联接和 : SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表 , 职工表 ;WHERE 仓库表.仓库号=职工表.仓库号&是简单联接查询以上三种联接语句的结果都是一样的。 67例532左联接,即除满足联接条件的记录出现在查询结果中外,第一个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表 LEFT JOIN 职工表 ;ON 仓库表.仓库号=职工表.仓库号6869为了看到右联接和全联接的效果,假设在职工表中插入了如下一条记录: “WH8”,“E8”,1200例5.33 右联接,即除满足联接条件的记录出现在查询结果中外,第二个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表RIGHT JOIN 职工表 ;ON 仓库表.仓库号=职工表.仓库号7071例5.34全联接,即除满足联接条件的记录出现在查询结果中外,两个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库表.仓库号,城市,面积,职工号,工资;FROM仓库表FULL JOIN 职工表 ;ON 仓库表.仓库号=职工表.仓库号7273注意:Visual FoxPro的SQL SELECT 语句的联接格式只能实现两个表的联接,如果要实现多个表的联接,还需要使用标准格式。例如下面是一个基于4个关系的联接查询(用简单联接)SELECT 仓库表.仓库号,城市,供应商名,地址;FROM 供应商表,订购单表,职工表,仓库表;WHERE 供应商表.供应商号=订购单表.供应商号;AND 订购单表.职工号=职工表.职工号;AND 职工表.仓库号=仓库表.仓库号74755.2.13 集合并运算集合并运算 SQP 支持集合的并(UNION)运算,即可以将两个SELECT语句的查询结果通过并运算合度成一个查询结果。为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应字段的值要出自一个值同一个值域,即具有相同的数据类型的取值范围。例如:如下语句的结果是城市为北京和上海的仓库信息SELECT*FROM仓库表WHERE城市=北京;UNION; SELECT*FROM仓库表 WHERE城市=上海76775.2.14 Visual ForPro中中SQL SELECT的的几个特殊选项几个特殊选项v1.显示部分结果v例5.35 只显示前几项记录。v有时只需要满足条件的前几个记录,这时使用TOP nExpr PERCENT短语非常有用,其中nExpr是数字表达式,当不使用PERCENT时,nExpr是1至32 767间的整数,说明显示前几个记录:当使用PERCENT时,nExpr是0.01至99.99间的实数,说明显示结果中前百分之几的记录。需要注意的是TOP短语要与ORDER BY短语同时使用才有效。 78例5.36显示工资最高的三位职工的信息。SELECT* TOP 3 FROM职工表ORDER BY 工资DESC结果是:WH2 E4 1250WH1 E7 1250WH3 E6 123079例5.37显示工资最低的那30%职工的信息。SELECT*TOP 30 PERCENT FROM 职工表ORDER BY 工资结果是:WH5 E8 1200WH1 E3 121080v2.将查询结果存放在数组中v可以使用INTO ARRAY ArrayName短语将查询结果存放到数组中。ArrayName可以是任意的数组变量名。一般将存放查询结果的数组作为二维数组来使用,每行一条记录,每列对应于查询结果的一列。查询结果存放在数组中,可以非常方便地在程序中使用。 81v例如,下语句将查询到的职工信息存放在数组tmp中;然后用 list memo like tmp命令将数组内容显示出来。vSELECT*FROM职工表INTO ARRAY tmpv其中:Tmp(1,1)存放的是第一条记录的仓库号字段值,tem(1,3)存放的是第一条记录的工资字段值等。82其中:Tmp(1,1)存放的是第一条记录的仓库号字段值,tem(1,3)存放的是第一条记录的工资字段值等。833.将查询结果存放在临时文件中使用短语INTO CURSOR CursorName可以将查询结果存放到临时数据库文件中,其中CursorName是临时文件名,该短语产生的临时文件是一个只读的dbf文件,当查询结束后该临时文件是当前文件,可以像一般的dbf文件一样使用,但仅是只读。当关闭文件时该文件将自动删除。例如:如下语句将查询到的职工信息存放在临时dbf文件tem中。 SELECT*FROM职工表INTO CURSOR temList(可用list 命令将临时dbf文件tem显示出来) 84一般利用INTO CURSOR短语存放一些临时结果,比如一些复杂的汇总可能需要分阶段完成,需要根据几个中间结果再汇总等,这时利用该短语存放中间结果就非常适合,当使用完成后这些临时文件会自动删除。85v4.将查询结果存放到永久表中v使用短语INTO DBF TABLE TableName可以将查询结果存放到永久表中(dbf文件)。比如将,例5.36显示工资最高的三位职工的信息的查询结果存放在表highsal中vSELECT* TOP 3 FRoM 职工表 INTO TABLE highsal ORDER BY 工资 DESCvLIST:(highsal.dbf) 8687v5.将查询结果存放到文本文件中v使用短语TO FILE FileName ADDITIVE可以将查询结果存放到文本文件中,其中vFileName给出了文本文件名(默认扩展名是txt),如果使用ADDITIVE结果将追加在原文件的尾部,否则将覆盖原有文件。v如下语句将查询结果以文本的形式存储在文本文件tem.txt中:vSELECT*TOP 3 FROM 职工表 TO FILE tem ORDER BY 工资 DESC 8889v6.将查询结果直接输出到打印机v使用短语TO PRINTER PROMPT可以直接将查询结果输出到打印机,如果使用了vPROMPT选项,在开始打印之前会打开打印机设置对话框。905.3 操作功能操作功能v5.3.1 插入插入v标准格式:标准格式:v insert into dbf_name(fname1,fname2,.) values (expression1,expression2,.)vVF特殊格式:特殊格式:v insert into dbf_name from array arrayname|from memvar91vinsert into 订购单订购单(职工号职工号,订购单号订购单号) values (e7,or01) vinsert into 订购单订购单 values (E7,S4,OR01,2001-05-25,42000)92use 订购单订购单SCATTER TO ARR1COPY STRUCTURE TO ORD2INSERT INTO ORD2 FROM ARRAY ARR1SELECT ORD2BROWSEUSEDELETE FILE ORD2.DBF93USE 订购单订购单SCATTER MEMVARCOPY STRUCTURE TO ORD2INSERT INTO ORD2 FROM MEMVARSELECT ORD2BROWSEUSEDELETE FILE ORD2.DBF94v5.3.2 更新更新v命令格式:命令格式: update tablename set column_name1=expression1,column_name2=expression2. where conditionv实例:实例: update 职工职工 set 工资工资=工资工资*1.10 where 仓库号仓库号=WH1vupdate 学生学生 set 年龄年龄=年龄年龄+195v5.3.3 删除删除v命令格式:命令格式: delete from tablename where conditionv实例:实例: delete from 仓库仓库 where 仓库号仓库号=WH2v注意:注意: 在在VF中,中,SQL DELETE命令仍是命令仍是逻辑删除记录,如要物理删除需继续使用逻辑删除记录,如要物理删除需继续使用PACK命令。命令。 965.4 定义功能定义功能v5.4.1 表的定义表的定义v命令格式:命令格式: create table|dbf tablename1 name longtablename free(fieldname1 fieldtype (fieldwidth,precision)null|not null check lexpression1error cmessagetext1 default expression1 primary key|unique references tablename2 tag tagname1 nocptransv,fieldname2. ,primarykey key expression2 tag tagname2|,unique expression3 tag tagname3 ,foreign key expression4 tag tagname4nodup references tablename3tag tagname5 ,check lexpression2 error cmessagetext2)v| from array arrayname97vcreate table 仓库仓库1(仓库号(仓库号 c(5) primary key,城市城市 c(10),面积面积 i check(面积面积0) error “面积面积应该大于应该大于0!”)v create table 职工职工1(仓库号仓库号 c(5),职工号职工号 c(5) primary key,工资工资 i check(工资工资=1000 and 工资工资0 error 总金额应该大于总金额应该大于0! alter table 订订购单购单1 alter 订购单号订购单号 c(6) 101v命令格式命令格式2: alter table tablename1 alter column fieldname2 null |not null set default expression2 set check lexpression2 error cmessagetext2 drop default drop checkv实例:实例: alter table 订购单订购单1 alter 总金额总金额 set check 总金额总金额 100 error 总金额应总金额应该大于该大于100! alter table 订购单订购单1 alter 总总金额金额 drop check 102v命令格式命令格式3: alter table tablename1 drop column fieldname3 set check lexpression3 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 tagname6 save rename column fieldname4 to fieldname5103v实例:实例: valter table 订购单订购单1 rename column 总金总金额额 to 金额金额 alter table 订购单订购单1 drop column 金额金额v alter table 订购单订购单1 add unique 职工号职工号+供应商号供应商号 tag emp_sup alter table 订购订购单单1 drop unique tag emp_sup 104v5.4.4 视图的定义视图的定义v 在在VF中视图是一个定制的虚拟表,他可中视图是一个定制的虚拟表,他可以是本地的、远程的或带参数的。他可引以是本地的、远程的或带参数的。他可引用一个或多个表,或者引用其他视图。用一个或多个表,或者引用其他视图。v命令格式:命令格式: v create view view_name (column_name ,column_name.) as select_statement105v从单个表派生出的视图从单个表派生出的视图 vcreate view e_w as select 职工号职工号,仓库仓库号号 from 职工职工vcreate view v_bj as select 仓库号仓库号,面积面积 from 仓库仓库 where 城市城市=北京北京106v从多个表派生出的视图从多个表派生出的视图 vcreate view v_sample as select out.职职工号工号,out.供应商号供应商号,out.订购单号订购单号,out.订订购日期购日期,out.总金额总金额 from 订购单订购单 out where=(select max(总金额总金额) from 订购订购单单 inner1 where out.职工号职工号=inner1.职职工号工号)vcreate view v_sample as select 职工号职工号,工资工资,城市城市 from 职工职工,仓库仓库 where 职工职工.仓库号仓库号=仓库仓库.仓库号仓库号107v视图中的虚字段视图中的虚字段 vcreate view v_sal as select 职工号职工号,工资工资 as 月工资月工资,工资工资*12 as 年工资年工资 from 职工职工v视图的删除视图的删除 vdrop view v关于视图的说明关于视图的说明 v在关系数据库中,视图始终不真正含有数据,在关系数据库中,视图始终不真正含有数据,它总是原表的一个窗口。所以虽然视图可以象它总是原表的一个窗口。所以虽然视图可以象表一样进行各种查询,但插入、更新和删除操表一样进行各种查询,但插入、更新和删除操作在视图上却有一定限制。当视图是由单个表作在视图上却有一定限制。当视图是由单个表导出时可以进行插入和更新操作,否则其他均导出时可以进行插入和更新操作,否则其他均不行。不行。108v【小结】本节用大量实例介绍了SQL SELECT语句的使用方法,这些实例都可以在Visual ForPro下执行。掌握SQL SELECT不仅对学好、用好Visual ForPro至关重要,也是以后使用其他数据库或开发数据库应用程序的基础,建议读者多下一些功夫,真正掌握SQL SELECT语句的使用方法。v需要说明的是,Visual ForPro在支持标准SQL方面还有一些限制和遗憾,例如不支持多层嵌套查询、不支持COMPUTE短语等,这些功能是很有用的,限于本书的性质,在此不再一一介绍。109v习题:v教材习题五P141v上机实验:v实验十:查询和视图的使用实验十:查询和视图的使用v实验目的:实验目的:掌握查询和视图的使用v实验要求:实验要求:v熟悉掌握查询设计器的使用方法,能够创建和使用单表查询、多表查询的方法v熟悉掌握SELECT-SQL查询语句,并能够应用其进行查询v实验内容:实验内容:v验证性实验:参考实训教程 第一部分Visual FoxPro程序设计实验中实验6
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 销售管理


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!