关系型数据库标准语言SQL.ppt_第1页
关系型数据库标准语言SQL.ppt_第2页
关系型数据库标准语言SQL.ppt_第3页
关系型数据库标准语言SQL.ppt_第4页
关系型数据库标准语言SQL.ppt_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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是一种高度非过程化的语言 SQL非常简洁 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短语构成无条件查询 SELECT 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 职工号 FROM 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短语来消除查询中的重复结果(重复行)。,加入 DISTINCT 后的SELECT命令如下: SELECT DISTINCT 仓库号 FROM zg WHERE 工资1210 结果显示如下图所示:,4.2.3 简单的连接查询,简单的连接查询是一类基于多个表的查询 一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。 如果一个查询同时涉及两个以上的表,则称为连接查询。 其基本格式是: SELECT select_Item1,select_Item2 FROM TableName1, TableName2 WHERE JoinCondition 注:当FROM之后的多个关系中含有相同的属性名时,引用该属性名必须用关系前缀指明属性所属的关系,即TableName.属性名,“.”前面的是关系名,后面是属性名。,4.2.3 简单的连接查询,例4.4 找出工作在面积大于340的仓库的职工的职工号和职工所在的城市。 SELECT 职工号,城市 FROM ck,zg; WHERE ck.仓库号=zg.仓库号 AND 面积340 结果显示如下图所示:,4.2.4 嵌套查询,嵌套查询在SQL中,可以将一个select查询语句嵌入到另一个select查询语句中,这称为嵌套查询。 将内嵌的select语句称为子查询。 标准的SQL允许子查询可以嵌套多层,但在VFP中,不允许多层嵌套,即子查询不能再嵌套了。 一般来说,当查询所要求的结果出自一个关系,但查询条件却涉及多个关系时。例如,当检索关系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; (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月全国计算机等级考试二级(VFP)笔试试卷第一大题选择题,第(33)小题:“查询选修课程号为101的课程得分最高的同学”与此题类似。,附:嵌套查询与连接查询之间的转换,有些嵌套查询可以转换为连接查询,但也有一些嵌套查询不能被转换为连接查询。 思考:什么样的嵌套查询可以被转换为连接查询? 例:将“例4.5 查询哪些城市的仓库至少有一个职工工资为1220元?”改用连接查询来做。,4.2.5 几个特殊运算符,SQL SELECT有如下几个特殊运算符: BETWEENAND介于和之间,并且包括两个边界值。 LIKE字符串匹配运算符 通配符 “%” 表示0个或多个字符 通配符 “_”(下划线)表示一个字符(可以是一个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-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 性别=“女” 或 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都必须对应查询结果中的一列。 排序的顺序可以是升序(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 查询结果:,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 gys 或 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 所得到的结果都是一致的,因为在学生表中“学号”值是彼此不同的。 (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最小值函数,求指定列中的最小值。 注:这些函数可以在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 城市=“西安”),4.2.8 分组与计算查询,在SELECT-SQL命令中,常用GROUP BY子句对查询结果进行分组。 其短语的格式如下: GROUP BY GroupColumn ,GroupColumn HAVING FilterCondition,指定分组字段,分组字段可以有多个。,对分组结果进行筛选,指定筛选条件,使用GROUP BY进行分组时,查询结果是指定表按分组的记录集。 可以按一列或多列分组,还可以用HAVING进一步限定分组的条件。 GroupColumn可以是表的字段,也可以是一个数值表达式。 HAVING子句总是跟在GROUP BY子句之后,而不可以单独使用。 注: 当使用 group 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 职工人数; FROM 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日之后(含该天)签订过两件以上(含两件)订单的职工的职工号。 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、空格和空字符串不同。 排序时具有最大的优先权。 可以用于计算和大多数的函数中。 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 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.成绩; FROM 学生 s,成绩 sc,课程 c; WHERE s.学号=sc.学号 and sc.课程号=c.课程号 使用别名后,这一SELECT命令写得更简洁了。,其中“雇员号”和“经理”这两个属性出自同一属性域,同一元组的这两个属性值是上、下级(领导与被领导)关系。因此,可以将雇员关系与其自身连接得到具体反映各雇员间上、下级关系的关系。,2. 自连接查询 关系的自连接对有些关系来说,可以将它与其自身进行连接,例如,雇员(雇员号,雇员姓名,经理),称这种关系与其自身的连接为自连接。,说明:能够作自连接的关系必须满足的条件是,它有两个出于同一属性域的属性(显然这两个属性是不同名的),其中一个属性以另一属性的取值为值,例如,上面“雇员”关系中的“经理”以“雇员号”作为自身的取值。,2. 自连接查询 例:根据如下的“辅导”关系列出同学之间辅导与被辅导的关系。 “辅导”关系如下图所示:,“辅导”关系自连接图示如下:,2. 自连接查询 sele fd.学生姓名 ,“辅导“,bfd.学生姓名 from; 辅导 fd ,辅导 bfd where fd.学生号=bfd.辅导同学结果如下图所示:,2. 自连接查询 注意:如果将上面命令写成如下形式,就是错误的: SELECT fd.学生姓名,“辅导” AS 辅导,bfd.学生姓名; FROM 辅导 fd,辅导 bfd; WHERE bfd.学生号fd.辅导同学 或 SELECT bfd.学生姓名,“辅导” AS 辅导,fd.学生姓名; FROM 辅导 fd,辅导 bfd; WHERE fd.学生号bfd.辅导同学 结果如下图所示:,同上,与辅导同学处于同一行的学生姓名是被辅导者的姓名,将它放在前面(看作辅导者)是错误的。,显然上面结果是错误的。,4.2.11 内外层相互关联的嵌套查询,内外层相互关联的嵌套查询前面讨论过的嵌套查询都是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。实际上,有时候,内层查询的条件需要外层查询指定的关系来提供值,而外层查询的条件涉及内层查询的结果。,4.2.11 内外层相互关联的嵌套查询,例:设有如下的的订购单表dgd2.dbf,查询每个职工经手的具有最高总金额的订购单信息。 订购单表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则要求子查询中的所有行都使条件为真时,结果才为真。 注:格式中的“”通常是查询中指定关系的属性名。,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是用来检查在子查询中是否有结果返回(即存在元组或不存在元组)。 注: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; (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 超连接查询,“=*”称为右连接,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 JoinCondition WHERE ,进行表的连接运算,连接的类型有: INNER JOIN内连接; LEFT JOIN左连接; RIGHT JOIN右连接; FULL JOIN全连接。,4.2.13 超连接查询,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.仓库号,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 超连接查询,例:多表的内连接(结果中只会含有多个表的满足连接条件的记录)。 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.职工号,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命令的查询结果中包含的列数必须相同。 两个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 城市=“西安”,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 (3)INTO TABLE | DBF TableName 3. 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,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 子句设置查询去向 例:查询工资最高的职工的信息并将结果存入名为“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 * FROM 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”, “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(职工号,供应商号,订购单号,订购日期) 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 成绩=成绩+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 数据删除,例:删除所有工作在城市为“上海”的仓库的职工的数据。 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) PRIMA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论