关系型数据库标准语言SQL.ppt

上传人:小飞机 文档编号:5928533 上传时间:2023-09-05 格式:PPT 页数:114 大小:617.50KB
返回 下载 相关 举报
关系型数据库标准语言SQL.ppt_第1页
第1页 / 共114页
关系型数据库标准语言SQL.ppt_第2页
第2页 / 共114页
关系型数据库标准语言SQL.ppt_第3页
第3页 / 共114页
关系型数据库标准语言SQL.ppt_第4页
第4页 / 共114页
关系型数据库标准语言SQL.ppt_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《关系型数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《关系型数据库标准语言SQL.ppt(114页珍藏版)》请在三一办公上搜索。

1、第4章 关系型数据库标准语言SQL,内容提要,4.1 SQL概述4.2 查询功能4.3 操作功能4.4 定义功能4.5 典型例题解析4.6 小型案例实训4.7 本章小结4.8 习题,4.1 SQL概述,SQLStructured Query Language(结构化查询语言)的缩写 SQL目前已成为关系数据库的标准语言。现在所有的关系型数据库管理系统都支持SQL,VFP也不例外。SQL包含了数据定义、数据操纵和数据控制功能。,SQL的主要特点 SQL是一种一体化的语言,它包含数据定义、数据查询、数据操纵和数据控制等方面的功能,可以完成数据库活动中的全部工作。SQL是一种高度非过程化的语言 SQ

2、L非常简洁 SQL可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。,表4-1 SQL命令动词,SQL命令动词,4.2 查 询 功 能,查询是SQL的核心 SQL的查询命令SELECT SQL-SELECT命令可以从一个表或多个表或视图中检索数据,4.2.1 创建SELECT命令 SELECT命令详解:(略),4.2.1 创建SELECT命令 可以在以下3个区域中创建SELECT命令:在命令窗口中在VFP程序中在查询设计器中,4.2.2 简单查询,简单查询是针对单个表的查询 查询仅涉及一个表,是一种最简单的查询。无条件查由SELECT和FROM短语构成无条件查询 SELEC

3、T select_Item FROM TableName 条件查询由SELECT、FROM和WHERE短语构成条件查询SELECT select_Item FROM TableName WHERE FilterCondition,指定查询条件,4.2.2 简单查询,例4.1 从zg关系中检索所有职工的工资值。SELECT 工资 FROM zg结果显示如图4-2所示:,图4-2 检索所有的工资值,例:检索zg关系的所有元组。SELECT 仓库号,职工号,工资 FROM zg或SELECT*FROM zg,查询结果:,例4.2 从zg关系中检索工资多于1220元的职工号。SELECT 职工号 FR

4、OM zg WHERE 工资1220结果显示如图4-3所示:,图4-3 检索工资结果,例4.3 检索在仓库WH2或WH1工作,并且工资少于1250元的职工的职工号。SELECT 职工号 FROM zg WHERE(仓库号=“WH2”OR 仓库号=“WH1”)AND 工资1250结果显示如下图所示:,例:检索有工资多于1210元的职工的仓库的仓库号。SELECT 仓库号 FROM zg WHERE 工资1210结果显示如下图所示:,上面结果中“WH2”出现了两次,显然是重复的,我们并不希望看到这种情况的发生,为此我们可以使用DISTINCT短语来消除查询中的重复结果(重复行)。,加入 DISTI

5、NCT 后的SELECT命令如下:SELECT DISTINCT 仓库号 FROM zg WHERE工资1210结果显示如下图所示:,4.2.3 简单的连接查询,简单的连接查询是一类基于多个表的查询 一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。如果一个查询同时涉及两个以上的表,则称为连接查询。其基本格式是:SELECT select_Item1,select_Item2 FROM TableName1,TableName2 WHERE JoinCondition注:当FROM之后的多个关系中含有相同的属性名时,引用该属性名必须用关系前缀指明属性所属的关系,即Tabl

6、eName.属性名,“.”前面的是关系名,后面是属性名。,4.2.3 简单的连接查询,例4.4 找出工作在面积大于340的仓库的职工的职工号和职工所在的城市。SELECT 职工号,城市 FROM ck,zg;WHERE ck.仓库号=zg.仓库号 AND 面积340 结果显示如下图所示:,4.2.4 嵌套查询,嵌套查询在SQL中,可以将一个select查询语句嵌入到另一个select查询语句中,这称为嵌套查询。将内嵌的select语句称为子查询。标准的SQL允许子查询可以嵌套多层,但在VFP中,不允许多层嵌套,即子查询不能再嵌套了。一般来说,当查询所要求的结果出自一个关系,但查询条件却涉及多个

7、关系时。例如,当检索关系X中的元组时,它的条件依赖于相关的关系Y中的元组的属性值,这时使用SQL的嵌套查询功能将非常方便。,4.2.4 嵌套查询,嵌套查询的一般格式为:SELECT select_Item1 FROM TableName1 WHERE FilterCondition1 IN;(SELECT select_Item2 FROM TableName2 WHERE FilterCondition2)注:内嵌的子查询要用圆括号括起来。,4.2.4 嵌套查询,例4.5 查询哪些城市的仓库至少有一个职工工资为1220元?嵌套查询:SELECT 城市 FROM ck WHERE 仓库号 IN

8、;(SELECT 仓库号 FROM zg WHERE 工资=1220)结果显示如下图所示:,4.2.4 嵌套查询,例4.6 查询和职工E4工资相同的所有职工的记录嵌套查询:SELECT*FROM zg WHERE 工资;(SELECT 工资 FROM zg WHERE 职工号=“E4”)结果显示如下图所示:,4.2.4 嵌套查询,例:查询具有最高工资的职工的信息。嵌套查询:SELECT*FROM zg WHERE 工资;(SELECT MAX(工资)FROM zg)结果显示如下图所示:,4.2.4 嵌套查询,思考:查询有职工的工资高于“E3”的工资的仓库的所在城市及其面积。参考答案注:2007

9、年9月全国计算机等级考试二级(VFP)笔试试卷第一大题选择题,第(33)小题:“查询选修课程号为101的课程得分最高的同学”与此题类似。,附:嵌套查询与连接查询之间的转换,有些嵌套查询可以转换为连接查询,但也有一些嵌套查询不能被转换为连接查询。思考:什么样的嵌套查询可以被转换为连接查询?例:将“例4.5 查询哪些城市的仓库至少有一个职工工资为1220元?”改用连接查询来做。,4.2.5 几个特殊运算符,SQL SELECT有如下几个特殊运算符:BETWEENAND介于和之间,并且包括两个边界值。LIKE字符串匹配运算符 通配符“%”表示0个或多个字符 通配符“_”(下划线)表示一个字符(可以是

10、一个ASCII码字符,也可以是一个汉字字符)。!=在SQL中“不等于”用“!=”表示,另外还可以用否定运算符 NOT 写出等价的命令。,4.2.5 几个特殊运算符,例4.7 查询工资在12201270元之间的职工所有信息。SELECT*FROM zg WHERE 工资 BETWEEN 1220 AND 1270等价于SELECT*FROM zg WHERE 工资=1220 AND 工资=1270,4.2.5 几个特殊运算符,例:在dgd关系中查询在2001年7月1日至7月31日之间签订过订单的职工的职工号。SELECT 职工号 FROM dgd WHERE 订购日期 BETWEEN 2001-

11、7-1 AND 2001-7-31等价于SELECT 职工号 FROM dgd WHERE 订购日期=2001-7-1 AND 订购日期=2001-7-31,4.2.5 几个特殊运算符,例4.8 从gys关系中查询出全部公司的信息,不要工厂和其他供应商的信息。SELECT*FROM gys WHERE 订货商名 like“%公司”查询结果:,4.2.5 几个特殊运算符,例:从学生关系中检索出所有王姓学生的信息。SELECT*FROM 学生 WHERE 姓名 like“王%”查询结果:,4.2.5 几个特殊运算符,例:从学生关系中检索出所有女生的信息。SELECT*FROM 学生 WHERE 性

12、别=“女”或SELECT*FROM 学生 WHERE 性别 like“女”查询结果:,4.2.5 几个特殊运算符,思考:SELECT*FROM 学生 WHERE 姓名 not like“王%”的结果是什么?SELECT*FROM 学生 WHERE not 姓名 like“王%”的结果又是什么?它与上面的SELECT查询命令是相同的吗?,4.2.6 排序,SQL SELECT命令可以对查询结果进行排序,实现排序的短语是ORDER 了BY,具体格式如下:ORDER BY Order_Item ASC|DESC,Order_Item ASC|DESC ORDER BY短语中的每个Order_Item

13、都必须对应查询结果中的一列。排序的顺序可以是升序(ASC)或降序(DESC)可以按一列或多列排序,当指定多列排序时,各列列名之间用“,”分隔。,4.2.6 排序,例4.9 查找出zg表中所有职工的信息并将结果按工资升序排序。SELECT*FROM zg ORDER BY 工资或SELECT*FROM zg ORDER BY 工资 ASC查询结果:,4.2.6 排序,例:检索所有的学生的信息,结果按年龄降序排序,年龄相同的,按学号升序排序。SELECT*FROM 学生 ORDER BY 年龄 DESC,学号或SELECT*FROM 学生 ORDER BY 年龄 DESC,学号 ASC查询结果:,

14、4.2.7 简单的计算查询,SQL不仅可以查询表中的数据,而且还可以对表中的数据进行计算。例如,从zg表中检索职工的平均工资,检索某个仓库中职工的最高工资,统计某仓库的职工人数等等。,4.2.7 简单的计算查询,SQL用于计算查询的函数:COUNT计数函数用法:(1)COUNT(column_name)返回给定表中指定列的值的个数(NULL值不计入)(2)COUNT(*)返回指定表中匹配指定条件的行的数目注:COUNT 和 DISTINCT 经常被合起来使用,4.2.7 简单的计算查询,例4.10 查询gys表中供应商所在地的数目。SELECT COUNT(DISTINCT 地址)FROM g

15、ys或SELECT COUNT(DISTINCT 地址)AS 供应商所在地个数 FROM gys!注意:上面COUNT函数中“地址”前面的DISTINCT不可少,否则结果是错误的,即SELECT COUNT(地址)FROM gys得到的结果不是供应商所在地的个数。,4.2.7 简单的计算查询,例:查询学生表中登记的学生的人数。SELECT COUNT(*)FROM 学生或SELECT COUNT(*)AS 学生人数 FROM 学生或SELECT COUNT(学号)AS 学生人数 FROM 学生注:(1)此时“学号”前面加不加DISTINCT 所得到的结果都是一致的,因为在学生表中“学号”值是彼

16、此不同的。(2)当查询列是表达式或函数时,常对列进行命名。,4.2.7 简单的计算查询,例:查询学生表中年龄在18岁至20岁之间的男生的人数。SELECT COUNT(*)AS 人数 FROM 学生;WHERE 年龄 between 18 and 20 AND 性别=“男”或SELECT COUNT(学号)AS 人数 FROM 学生;WHERE 年龄 between 18 and 20 AND 性别=“男”,4.2.7 简单的计算查询,SUM求和函数,计算指定列中数值的总和。AVG求平均值函数,计算列中数值的平均值。MAX最大值函数,求指定列中的最大值。MIN最小值函数,求指定列中的最小值。注

17、:这些函数可以在SELECT短语中对查询结果进行计算。,4.2.7 简单的计算查询,例4.11 计算支付给所有职工的工资总额。SELECT SUM(工资)AS 工资总额 FROM zg查询结果:,4.2.7 简单的计算查询,例4.12 求所在地为“北京”和“西安”的仓库的职工的工资总和。SELECT SUM(工资)AS 工资总和 FROM zg;WHERE 仓库号 IN;(SELECT 仓库号 FROM ck WHERE 城市=“北京”OR 城市=“西安”)或SELECT SUM(工资)AS 工资总和 FROM zg,ck;WHERE zg.仓库号=ck.仓库号 AND(城市=“北京”OR 城

18、市=“西安”),4.2.8 分组与计算查询,在SELECT-SQL命令中,常用GROUP BY子句对查询结果进行分组。其短语的格式如下:GROUP BY GroupColumn,GroupColumn HAVING FilterCondition,指定分组字段,分组字段可以有多个。,对分组结果进行筛选,指定筛选条件,使用GROUP BY进行分组时,查询结果是指定表按分组的记录集。可以按一列或多列分组,还可以用HAVING进一步限定分组的条件。GroupColumn可以是表的字段,也可以是一个数值表达式。HAVING子句总是跟在GROUP BY子句之后,而不可以单独使用。注:当使用 group

19、by 时,查询列(即紧跟在select后面的字段名或表达式)中除了在group by中出现的那(些)个字段可以以字段名形式出现外,其他的列上要用统计函数(sum,max,min,count 等),不然那句SQL就是错的。,4.2.8 分组与计算查询,例:求支付给每个仓库的职工的工资总额。SELECT 仓库号,SUM(工资)AS 工资总额 FROM zg;GROUP BY 仓库号查询结果:,4.2.8 分组与计算查询,例:求各仓库的职工人数。SELECT 仓库号,COUNT(*)AS 职工人数 FROM zg;GROUP BY 仓库号或SELECT 仓库号,COUNT(职工号)AS 职工人数;F

20、ROM zg GROUP BY 仓库号说明:SQL的分组功能常常与计算函数结合使用。,4.2.8 分组与计算查询,例:求各仓库工资高于1210元的职工的人数。SELECT 仓库号,COUNT(*)AS 职工人数 FROM zg;WHERE 工资1210;GROUP BY 仓库号查询结果:,4.2.8 分组与计算查询,例:检索平均工资大于或等于1230元的仓库的仓库号。SELECT 仓库号 FROM zg;GROUP BY 仓库号 HAVING AVG(工资)=1230思考:如何检索平均工资大于或等于1230元的仓库的详细信息?,4.2.8 分组与计算查询,例:在dgd关系中检索2001年6月1

21、日之后(含该天)签订过两件以上(含两件)订单的职工的职工号。SELECT 职工号 FROM dgd;WHERE 订购日期2001-6-1;GROUP BY 职工号 HAVING COUNT(*)=2说明:HAVING子句和WHERE子句并不矛盾,它们可以同时使用。在查询中总是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句对分组进行筛选。,4.2.9 利用空值查询,SQL支持空值(NULL),在SQL中可以利用空值进行查询。空值可写成“NULL”或“null”,也可写成“.NULL.”或“.null.”NULL值具有以下特点:等价于没有任何值。与0、空格和空字符串不同。排序时

22、具有最大的优先权。可以用于计算和大多数的函数中。NULL值不改变变量或字段的数据类型。NULL值会影响命令、函数、表达式的执行。,4.2.9 利用空值查询,例:从dgd关系中查询尚未确定供应商的订购单信息。SELECT*FROM dgd WHERE 供应商号 IS NULL注意:上面命令中“供应商 IS NULL”不能写成“供应商=NULL”“NULL”不是一个值,它只表示“还没有值”,不能作相等的比较。,4.2.9 利用空值查询,例4.16 从dgd关系中查询已经确定了供应商的订购单信息。SELECT*FROM dgd WHERE 供应商号 IS NOT NULL等价于SELECT*FROM

23、 dgd WHERE NOT 供应商号 IS NULL,4.2.10 别名与自连接查询,1.关系别名 在关系的连接操作中经常需要使用关系名作前缀来引用关系的属性(表的字段),例如,SELECT 学生.学号,学生.姓名,课程.课程号,课程.课程名,成绩.成绩;FROM 学生,成绩,课程;WHERE 学生.学号=成绩.学号 and 成绩.课程号=课程.课程号有时这样显得很麻烦,特别是在关系名较长的时候。因此,SQL允许在FROM短语和JOIN短语中为关系名定义别名。,4.2.10 别名与自连接查询,为关系定义别名的格式为:AS 例如:SELECT s.学号,s.姓名,c.课程号,c.课程名,sc.

24、成绩;FROM 学生 s,成绩 sc,课程 c;WHERE s.学号=sc.学号 and sc.课程号=c.课程号使用别名后,这一SELECT命令写得更简洁了。,其中“雇员号”和“经理”这两个属性出自同一属性域,同一元组的这两个属性值是上、下级(领导与被领导)关系。因此,可以将雇员关系与其自身连接得到具体反映各雇员间上、下级关系的关系。,2.自连接查询关系的自连接对有些关系来说,可以将它与其自身进行连接,例如,雇员(雇员号,雇员姓名,经理),称这种关系与其自身的连接为自连接。,说明:能够作自连接的关系必须满足的条件是,它有两个出于同一属性域的属性(显然这两个属性是不同名的),其中一个属性以另一

25、属性的取值为值,例如,上面“雇员”关系中的“经理”以“雇员号”作为自身的取值。,2.自连接查询例:根据如下的“辅导”关系列出同学之间辅导与被辅导的关系。“辅导”关系如下图所示:,“辅导”关系自连接图示如下:,2.自连接查询sele fd.学生姓名,辅导,bfd.学生姓名 from;辅导 fd,辅导 bfd where fd.学生号=bfd.辅导同学结果如下图所示:,2.自连接查询注意:如果将上面命令写成如下形式,就是错误的:SELECT fd.学生姓名,“辅导”AS 辅导,bfd.学生姓名;FROM 辅导 fd,辅导 bfd;WHERE bfd.学生号fd.辅导同学或SELECT bfd.学生

26、姓名,“辅导”AS 辅导,fd.学生姓名;FROM 辅导 fd,辅导 bfd;WHERE fd.学生号bfd.辅导同学结果如下图所示:,同上,与辅导同学处于同一行的学生姓名是被辅导者的姓名,将它放在前面(看作辅导者)是错误的。,显然上面结果是错误的。,4.2.11 内外层相互关联的嵌套查询,内外层相互关联的嵌套查询前面讨论过的嵌套查询都是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。实际上,有时候,内层查询的条件需要外层查询指定的关系来提供值,而外层查询的条件涉及内层查询的结果。,4.2.11 内外层相互关联的嵌套查询,例:设有如下的的订购单表dgd2.dbf,查询每个职工经手的具有

27、最高总金额的订购单信息。订购单表dgd2:,4.2.11 内外层相互关联的嵌套查询,上面查询对应命令如下:SELECT*FROM dgd2 out WHERE 总金额;(SELECT MAX(总金额)FROM dgd2 inn WHERE inn.职工号out.职工号)查询结果如下图所示:,4.2.12 使用量词和谓词的查询,1.量词量词包括:ANY、ALL和SOME其格式为:ANY|ALL|SOME(子查询)其中,ANY和SOME同义,在进行比较运算时只要子查询中有一行(一个元组)使条件为真,则结果就为真;而ALL则要求子查询中的所有行都使条件为真时,结果才为真。注:格式中的“”通常是查询中

28、指定关系的属性名。,4.2.12 使用量词和谓词的查询,1.量词例:检索有职工的工资大于或等于WH1仓库中所有职工的工资的仓库的仓库号。SELECT 仓库号 FROM zg WHERE 工资=ALL;(SELECT 工资 FROM zg WHERE 仓库号=“WH1”)上面命令等价于SELECT 仓库号 FROM zg WHERE 工资=;(SELECT MAX(工资)FROM zg WHERE 仓库号=“WH1”),4.2.12 使用量词和谓词的查询,2.谓词EXISTS格式:NOT EXISTS(子查询)EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回(即存在元组或不存

29、在元组)。注:NOT EXISTS(子查询)用于构成外层查询的查询条件,当子查询中有结果返回(即子查询中存在元组)时,EXISTS(子查询)为真,此时NOT EXISTS(子查询)为假;当子查询中没有结果返回(即子查询中不存在元组)时,EXISTS(子查询)为假,此时NOT EXISTS(子查询)为真。,4.2.12 使用量词和谓词的查询,2.谓词EXISTS例4.18 检索那些至少有一名职工的仓库的信息。SELECT*FROM ck WHERE EXISTS;(SELECT*FROM zg WHERE 仓库号=ck.仓库号)上面命令等价于SELECT*FROM ck WHERE 仓库号 IN

30、;(SELECT 仓库号 FROM zg),4.2.12 使用量词和谓词的查询,2.谓词EXISTS例:检索那些还没有职工的仓库的信息。SELECT*FROM ck WHERE NOT EXISTS;(SELECT*FROM zg WHERE 仓库号=ck.仓库号)上面命令等价于SELECT*FROM ck WHERE 仓库号 NOT IN;(SELECT 仓库号 FROM zg),4.2.13 超连接查询,除了前面讲过的等值连接,新的SQL标准还支持两个新的关系连接运算符,它们是“*=”和“=*”。“*=”称为左连接,4.2.13 超连接查询,左连接示意图:,4.2.13 超连接查询,“=*

31、”称为右连接,4.2.13 超连接查询,右连接示意图:,指定连接条件,4.2.13 超连接查询,注意:Visual FoxPro并不支持“*=”和“=*”运算符,在VFP中是通过使用JOIN短语来实现超连接查询的。与超连接有关的语法格式如下:SELECT FROM Table AS Local_Alias INNER|LEFT|RIGHT|FULL JOIN Table AS Local_Alias ON JoinConditionWHERE,进行表的连接运算,连接的类型有:INNER JOIN内连接;LEFT JOIN左连接;RIGHT JOIN右连接;FULL JOIN全连接。,4.2.1

32、3 超连接查询,INNER JOIN内连接(这是超连接的默认类型)内连接与前面讲的等值连接的结果一致。LEFT JOIN左连接 RIGHT JOIN右连接 FULL JOIN全连接,4.2.13 超连接查询,例:内连接(与等值连接的结果一致,即两个表中只有满足连接条件的记录才出现在查询结果中)。SELECT ck.仓库号,ck.城市,ck.面积,zg.职工号,zg.工资;FROM ck JOIN zg ON ck.仓库号=zg.仓库号等价于SELECT ck.仓库号,ck.城市,ck.面积,zg.职工号,zg.工资;FROM ck INNER JOIN zg ON ck.仓库号=zg.仓库号,

33、4.2.13 超连接查询,上面命令也等价于SELECT ck.仓库号,ck.城市,ck.面积,zg.职工号,zg.工资;FROM ck,zg WHERE ck.仓库号=zg.仓库号查询结果:,4.2.13 超连接查询,例:查询工资在1210元以上的职工的职工号,工资及其所在城市。SELECT zg.职工号,zg.工资,ck.城市;FROM zg JOIN ck ON zg.仓库号=ck.仓库号;WHERE zg.工资1210等价于SELECT zg.职工号,zg.工资,ck.城市;FROM zg,ck WHERE ck.仓库号=zg.仓库号 AND zg.工资1210,4.2.13 超连接查询

34、,例:多表的内连接(结果中只会含有多个表的满足连接条件的记录)。SELECT ck.仓库号,ck.城市,ck.面积,zg.职工号,zg.工资,;dgd.订购单号,dgd.供应商号,dgd.订购日期;FROM ck JOIN zg JOIN dgd ON zg.职工号=dgd.职工号 ON ck.仓库号=zg.仓库号,4.2.13 超连接查询,上面命令也等价于SELECT ck.仓库号,ck.城市,ck.面积,zg.职工号,zg.工资,;dgd.订购单号,dgd.供应商号,dgd.订购日期;FROM ck,zg,dgd WHERE ck.仓库号=zg.仓库号 AND zg.职工号=dgd.职工号

35、,4.2.14 集合的并运算,SQL支持的集合运算符有UNION(并运算)、INTERSECT(交运算)以及EXCEPT(差运算)。但VFP只支持集合运算符UNION,不支持INTERSECT 和 EXCEPT 运算符。,4.2.14 集合的并运算,UNION并运算用法:SELECT FROM WHERE UNION ALL SELECT Command将两个结果集作并,即通过组合两个结果表并消去表中重复行而派生出一个新的结果表。当ALL 随 UNION 一起使用(即UNION ALL)时,不消除重复行。,4.2.14 集合的并运算,UNION子句遵守下列规则:两个SELECT命令的查询结果中

36、包含的列数必须相同。两个SELECT命令的查询结果中对应列的值要出自同一个值域(即要有相同的数据类型和宽度)。不能使用UNION来组合子查询。只有最后那个SELECT命令中可以包含ORDER BY子句,并且必须按顺序指出所输出的列。说明:使用UNION将多个查询结果合并起来,形成一个完整的查询结果时,系统会自动去掉结果中重复的元组。,4.2.14 集合的并运算,例4.20 查询城市为北京和西安的仓库信息。SELECT*FROM ck WHERE 城市=北京;UNION;SELECT*FROM ck WHERE 城市=西安“等价于SELECT*FROM ck WHERE 城市=“北京”OR 城市

37、=“西安”,4.2.14 集合的并运算,注:在VFP中,要将两个结果集作交(或差),需要使用逻辑运算AND(或运算NOT IN)。例:查询工作在“WH1”仓库的职工集合与工资高于1230元的职工集合的交集。SELECT*FROM zg WHERE 仓库号=“WH1“AND 工资1230上面查询等价于“查询工作在“WH1”仓库且工资高于1230元的职工的集合。”,4.2.15 SQL SELECT的几个特殊选项,1.Top n|Top n PERCENT只选择结果的前几行2.INTO 子句设置查询去向(1)INTO ARRY ArrayName(2)INTO CURSOR CursorName(

38、3)INTO TABLE|DBF TableName3.TO 子句设置查询去向(1)TO FILE FileName ADDITIVE(2)TO PRINTER PROMPT(3)TO SCREEN,4.2.15 SQL SELECT的几个特殊选项,1.Top n|Top n PERCENT只选择结果的前几行例:显示工资最高的三位职工的信息。SELECT TOP 3*FROM zg ORDER BY 工资 DESC或SELECT*TOP 3 FROM zg ORDER BY 工资 DESC思考:上面命令能否写成SELECT TOP 3*FROM zg或 SELECT*TOP 3 FROM zg

39、,4.2.15 SQL SELECT的几个特殊选项,2.INTO 子句设置查询去向例:查询工资最高的职工的信息并将结果存入数组arr。SELECT*FROM zg INTO ARRAY arr;WHERE 工资=(SELECT max(工资)FROM zg)或SELECT*FROM zg WHERE 工资=;(SELECT max(工资)FROM zg)INTO ARRAY arr注:INTO 子句可以放在FROMJOIN子句之后,也可以放在整个SELECT命令的末尾。,4.2.15 SQL SELECT的几个特殊选项,2.INTO 子句设置查询去向例:查询工资最高的职工的信息并将结果存入名为

40、“cursor1”的临时表。SELECT*FROM zg INTO CURSOR cursor1;WHERE 工资=(SELECT max(工资)FROM zg)或SELECT*FROM zg WHERE 工资=;(SELECT max(工资)FROM zg)INTO CURSOR cursor1,4.2.15 SQL SELECT的几个特殊选项,2.INTO 子句设置查询去向例:查询工资最高的职工的信息并将结果存入名为“table1”的物理表。SELECT*FROM zg INTO TABLE table1;WHERE 工资=(SELECT max(工资)FROM zg)或SELECT*FR

41、OM zg WHERE 工资=;(SELECT max(工资)FROM zg)INTO TABLE table1,4.3 操 作 功 能,SQL的数据操作功能包括 插入数据 更新数据 删除数据这三个方面。,4.3.1 数据插入INSERTSQL中用于插入数据的命令命令格式:(1)INSERT INTO dbf_name(fname1,fname2,)VALUES(eExpression1,eExpression2,)(2)INSERT INTO dbf_name FROM ARRAY ArrayName|FROM MEMVAR,4.3.1 数据插入,例:向dgd关系中插入元组(“E7”,“S4

42、”,“OR01”,2001/05/25)。INSERT INTO dgd VALUES(“E7”,“S4”,“OR01”,2001/05/25)或INSERT INTO dgd(职工号,供应商号,订购单号,订购日期)VALUES(“E7”,“S4”,“OR01”,2001/05/25),4.3.1 数据插入,例:假设有一件订单,职工号为“E4”,订购单号为“OR02”,供应商和订购日期均未确定,将该订单信息插入到dgd关系中。INSERT INTO dgd VALUES(“E4”,.null.,“OR02”,.null.)或INSERT INTO dgd(职工号,供应商号,订购单号,订购日期)

43、VALUES(“E4”,.null.,“OR01”,.null),4.3.1 数据插入,也可以用如下命令来完成上面例题中所述订单信息的插入:INSERT INTO dgd(职工号,订购单号)VALUES(“E4”,“OR02”)思考:能否将上面命令写成如下形式?(1)INSERT INTO dgd VALUES(“E4”,“OR01”)(2)INSERT INTO dgd(订购单号,职工号)VALUES(“OR02”,“E4”),4.3.2 数据更新,UPDATESQL用于数据更新的命令命令格式:例:将“选课”表中学生号为“003”号的学生成绩增加15分。UPDATE 选课 SET 成绩=成绩

44、+15 WHERE 学生号=“003”,4.3.2 数据更新,例:将zg关系中所有职工的工资增加100元。UPDATE zg SET 工资=工资+100,4.3.2 数据更新,例:给工作在城市为“上海”的仓库的职工工资增加100元。UPDATE zg SET 工资=工资+100 WHERE 仓库号 IN;(SELECT 仓库号 FROM ck WHERE 城市=“上海”),4.3.3 数据删除,DELETESQL用于删除记录数据的命令例:删除ck关系中仓库号是“WH2”的元组。DELETE FROM ck WHERE 仓库号=“WH2”,4.3.3 数据删除,例:删除所有工作在城市为“上海”的

45、仓库的职工的数据。DELETE FROM zg WHERE 仓库号 IN;(SELECT 仓库号 FROM ck WHERE 城市=“上海”),4.4.1 表的定义CREATE TABLE建立表的命令命令格式:(略),4.4 定 义 功 能,4.4.1 表的定义,例:建立“仓库1”表,该表的结构如下:仓库1(仓库号 C(4),城市 C(4),面积 I),并将“仓库号”定义为主关键字。CREATE TABLE 仓库1(;仓库号 C(4)PRIMARY KEY,城市 C(4),面积 I),显然上面创建的“仓库1”表是数据库表,因此在执行上述命令之前要先打开数据库“订货管理”,如果该数据库不存在,则

46、要先建立它。,4.4.1 表的定义,例:建立自由表“成绩”,该表的结构如下:成绩(学号 C(8),课程名 C(12),成绩 N(5,1)。CREATE TABLE 成绩 FREE(;学号 C(8),课程名 C(20),成绩 N(5,1),4.4.2 表的删除DROP TABLE删除表命令格式:DROP TABLE TableName,删除指定的数据表文件。注:若要删除数据库中的表,最好先打开该数据库,在当前数据库下进行操作,否则,虽然从磁盘上删除了表对应的.dbf文件,但是该表在数据库中的信息却没有删除,以致此后在使用该数据库时会出现错误提示。,4.4.2 表的删除,例:删除数据库表“gys”

47、。OPEN DATABASE 订货管理DROP TABLE gys例:删除自由表“辅导”DROP TABLE 辅导,4.4.3 表结构的修改ALTER TABLE修改表结构的命令 ALTER TABLE 命令的四种格式,4.4.3 表结构的修改,例:修改“成绩”表的结构:将“课程名”字段的宽度改为20,将“成绩”字段的数据类型改为整型(I)。ALTER TABLE 成绩 ALTER 课程名 C(20)ALTER 成绩 I,修改表的属性的数据类型和宽度的格式跟定义表的属性时使用的格式是一样的。,4.4.3 表结构的修改,例:修改“仓库1”表:设置“面积”字段的有效性规则为,面积0,错误提示信息为

48、“面积值必须大于等于0!”,默认值为300。ALTER TABLE 仓库1 ALTER 面积;SET CHECK(面积0)ERROR“面积值必须大于等于0!”;SET DEFAULT 300,要为已有属性列设置有效性规则、错误提示信息和默认值需要使用格式2。,4.4.3 表结构的修改,例:修改“职工1”表的结构:删除“姓名”字段。ALTER TABLE 职工1 DROP 姓名,删除已有字段需要使用格式4。,4.4.3 表结构的修改,例:修改“成绩”表的结构:将“课程名”字段的字段名改为“课程名称”。ALTER TABLE 成绩 RENAME 课程名 TO 课程名称,修改字段名需要使用格式4。,

49、附:视图 视图视图是由一个或多个物理表派生出来的一张虚拟的表,在使用上和物理表类似,视图不对应具体的文件,它必须依赖于数据库而存在。视图是操作表的一种手段,通过视图可以更新表。1.创建视图CREATE VIEW创建视图的命令命令格式:CREATE VIEW AS select_statement,一个任意的SELECT查询命令。注意:此处SELECT命令不需要用圆括号括起来。,创建由单表派生的视图,附:视图,例:创建视图v_WH1,要求视图中包含所有工作在“WH1”仓库的职工信息。CREATE VIEW v_WH1 AS;SELECT 职工号,仓库号,工资 FROM zg WHERE 仓库号=“WH1”,创建由多表派生的视图,附:视图,例:创建视图v_sample,要求视图中包含所有职工的职工号、职工工作的仓库的仓库号、职工所在城市和职工工资信息。CREATE VIEW v_sample AS;SELECT 职工号,ck.仓库号,城市,工资 FROM zg,ck WHERE zg.仓库号=ck.仓库号,附:视图2.删除视图DROP VIEW删除视图的命令命令格式:DROP VIEW,附:视图,例:删除视图v_sample。DROP VIEW v_sample,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号