《Web数据库技术应用教程(第二版)》课件第3章_第1页
《Web数据库技术应用教程(第二版)》课件第3章_第2页
《Web数据库技术应用教程(第二版)》课件第3章_第3页
《Web数据库技术应用教程(第二版)》课件第3章_第4页
《Web数据库技术应用教程(第二版)》课件第3章_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

通过本章的学习,重点了解如下内容:了解SQL语言的产生与发展认识SQL语言的特点深入理解SQL语言所涉及的基本概念熟练使用SQL语言进行数据库定义、数据检索、数据插入、数据修改、数据删除等操作。本章主要内容3.1SQL概述SQL(StructuredQueryLanguage,结构化查询语言)主要特点有如下几条:(1)综合统一。SQL语言综合统一的特征体现在两个方面:首先,SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL功能于一体,充分体现了关系数据语言的特点和优点。其次,关系模型的实体及实体间的联系均用关系表示,数据结构的单一性使得SQL数据操作符也是统一的,其查询、插入、删除、修改都只有一种操作符。(2)高度非过程化的语言。而用SQL语言进行数据操作,用户只需提出“干什么”,至于“怎么干”由DBMS解决。(3)面向集合的语言。每一个SQL的操作对象是一个或多个关系,操作的结果也是一个关系。(4)以一种语法结构提供两种操作方式。即可独立使用,又可嵌入到宿主语言中使用,具有自主型和宿主型两种特点。(5)语言简捷,易学易用。3.1SQL概述(序)SELECT:从一个表或多个表中检索列和行;CREATE:按特定的表模式创建一个新表;DROP:删除一张表;ALTER:在一个表被建立之后,修改表的字段设计;INSERT:向一个表中增加行;UPDATE:更新表中已存在的行的某几列的值;DELETE:从一个表中删除行;GRANT:向数据库中的用户授以操作权限(如修改某个表的权限、删除某个表的权限);REVOKE:收回以前授予给当前数据库中用户的权限。3.2数据定义3.2.1创建数据库命令是:

CREATEWORKAMOUNTHEMAAUTHORIZATION<创建者>;例如,创建者是李平的命令如下:CREATEWORKAMOUNTHEMAAUTHORIZATION<李平>;大部分的DBMS,如DB2、XDB、DBASEIV创建数据库的命令语法格式如下:CREATEDATABASE<DATABASE_NAME>;例子:创建一个名为TEST1的数据库。CREATEDATABASETEST1;3.2.2表及其创建(1)基本表的定义。语句格式:CREATETABLE<表名>(<列名><数据类型>[<列级完整性约束条件>][,<列名><数据类型>[<列级完整性约束条件>]]…[,<表级完整性约束条件>]);<表名>:所要定义的基本表的名字。<列名>:组成该表的各个属性(列)。<列级完整性约束条件>:涉及相应属性列的完整性约束条件。<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件。【例3.1】建立一个“雇员”表Employee,它由职工号Number、姓名Name、性别Sex、年龄Age、所在部门Department五个属性组成。其中职工号不能为空,值是惟一的,并且姓名取值也惟一。CREATETABLEEmployee(NumberCHAR(5)NOTNULLUNIQUE,NameCHAR(20)UNIQUE,SexCHAR(1),AgeInteger,DepartmentCHAR(15));3.2.2表及其创建(序)建立表时,常用完整性约束主要有以下几种:主码约束:PRIMARYKEY。惟一性约束:UNIQUE。非空值约束:NOTNULL。默认约束:DEFAULT(**),将该列常用的值定义为缺省值,减少数据输入。检查约束:CHECK(**),通过约束条件表达式设置列值应满足的条件。3.2.2表及其创建(序)(2)基本表的删除。格式:DROPTABLE<表名>;【例3.2】删除Employee表。DROPTABLEEmployee;(3)基本表的修改。格式:ALTERTABLE<表名>[ADD<新列名><数据类型>[完整性约束]][DROP<完整性约束名>][MODIFY<列名><数据类型>];其中:<表名>:要修改的基本表。ADD子句:增加新列和新的完整性约束条件。DROP子句:删除指定的完整性约束条件。MODIFY子句:用于修改列名和数据类型。3.2.3约束(1)检查约束。检查约束是最常见的约束类型。它允许你声明在某个字段里的数值必须满足一个任意的表达式。用关键字CONSTRAINT。(2)非空约束。非空约束只是简单地声明一个字段必须不能是空值。(3)惟一约束。惟一约束UNIQUE保证在一个字段或者一组字段里的数据与表中其他行的数据相比是惟一的。(4)主码约束。主码约束只是惟一约束和非空约束的组合。(5)外码约束。外码约束声明一个字段(或者一组字段)的数值必须匹配另一个表中某些行出现的数值。3.2.3约束(序)一个表可以包含多于一个外码约束。有几种选择:1)级联删除(cascades):即将参照关系中的所有外码值与被参照关系中要删除元组值相对应的元组一起删除。2)受限删除(restricted):即当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相同时,系统才执行删除操作,否则拒绝此删除操作。3)置空值删除:即删除被参照关系的元组,并将参照关系中的元组所有与被参照关系中被删除元组主码值相同的外码值置为空值。3.2.4索引及其创建索引分为两种,聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包含实际的数据;记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然关系。索引的建立原则如下:(1)索引的建立与维护由DBA和DBMS完成。索引由DBA和DBO(表的属主)负责建立与删除,其他用户不得随意建立与删除。维护工作由DBMS自动完成。(2)大表应当建索引,小表不必建索引,一个基本表,不宜建较多索引。。(3)根据查询要求建立索引。3.2.4索引及其创建(序)(1)建立索引语句格式:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);用<表名>指定要建索引的基本表名字,索引可以建立在该表的一列或多列上,各列名之间用逗号分隔;<次序>指定索引值的排列次序,升序用ASC表示,降序用DESC表示。缺省值是ASC。UNIQUE表明此索引的每一个索引值只对应惟一的数据记录,CLUSTER表示要建立的索引是聚簇索引。3.2.4索引及其创建(序)【例3.8】为雇员Employee表按职工号升序建惟一索引。CREATEUNIQUEINDEXEmpNumberONEmployee(Number);【例3.9】在Employee表的Name(姓名)列上建立一个聚簇索引,而且Employee表中的记录将按照Name值的升序存放。CREATECLUSTERINDEXEmpNameONEmployee(Name);(2)删除索引DROPINDEX<索引名>;【例3.10】删除Employee表的EmpName索引。DROPINDEXEmpName;3.2.5存储过程与触发器1.存储过程存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。下面是TSQL命令创建存储过程语法格式:CREATEPROCEDUREprocedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]|[FORREPLICATION]ASsql_statement[...n]3.2.5存储过程与触发器(序)2.触发器:触发器是一种特殊类型的存储过程。它与存储过程的区别:触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字被直接调用执行。触发(tigger)有时也称为事件—条件—动作规则(event-condition-actionrules)或ECA规则,在三个方面不同于前面讨论的约束类型。(1)当数据库编程人员所指定的某些事件发生时才对触发程序进行测试。允许的事件种类通常为对特定关系的插入、删除或修改。(2)不是直接阻止事件的发生,而是由触发程序对条件进行测试。如果条件不满足,则什么也不做;否则,为响应该事件就会进行与该触发相关的处理。(3)如果触发条件得到满足,就由DBMS执行与该触发相关的动作。于是该动作可能阻止事件的发生或撤消事件(如删除插入的元组)。3.3数据操纵3.3.1数据插入语句格式:INSERTINTO<表名>[(<属性列1>[,<属性列2>…)]VALUES(<常量1>[,<常量2>]…)功能:将新元组插入指定表中。【例3.13】将一个新雇员记录(职工号:2008020;姓名:陈冬;性别:男;所在部门:一车间;年龄:28岁)插入到Employee表中。INSERTINTOEmployeeVALUES('2008020','陈冬','男','一车间',28);3.3.2数据更新数据更新包括数据修改和数据删除。(1)数据修改:语句格式:UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>]…[WHERE<条件>];功能:修改指定表中满足WHERE子句条件的元组。SET子句指定修改方式、要修改的列、修改后取值。WHERE子句指定要修改的元组,缺省表示要修改表中的所有元组。3.3.2数据更新(序)(2)数据删除。DELETEFROM<表名>[WHERE<条件>];功能:删除指定表中满足WHERE子句条件的元组。WHERE子句指定要删除的元组,缺省表示要修改表中的所有元组。3.4数据检索语句格式:SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>]…[WHERE<条件表达式>][GROUPBY<列名1>[HAVING<条件表达式>]][ORDERBY<列名2>[ASC|DESC]](1)SELECT子句:指明要检索的结果集的目标列。(2)FROM子句:指明从哪(几)个表(视图)中进行数据检索。(3)WHERE子句(行条件子句):通过条件表达式指明返回FROM子句中给出的列必须满足的标准。(4)GROUPBY子句(分组子句):对满足WHERE子句的行指明按照SELECT子句中所选择的某个(几个)列的值对整个结果集进行分组。(5)HAVING子句(分组条件子句):GROUPBY子句后可以带上HAVING条件子句组表达组选择条件,组选择条件为带有函数的条件表达式,它决定着整个组记录的取舍条件。(6)ORDERBY(排序子句):对查询返回的结果集进行排序。3.4.1单表查询单表查询的查询仅涉及一个表,又可以分成以下五种情况:选择表中的若干列、选择表中的若干元组、对查询结果排序、使用集函数查询、对查询结果分组。(1)选择表中的若干列。【例3.15】查询全体雇员的职工号与姓名。SELECTNumber,NameFROMEmployee;【例3.16】查询全体雇员的详细记录。SELECT*FROMEmployee;【例3.17】查询全体雇员的姓名及其出生年份。SELECTName,2008-AgeFROMEmployee;3.4.1单表查询(2)选择表中的若干元组。使用DISTINCT短语,可以消除取值重复的行。假设雇员工作量WorkAmount表中有下列数据: NumberJobNumberAmount200800119220080012852008001388200800229020080023803.4.1单表查询(序)【例3.19】查询已经分配了工作的雇员职工号。SELECTDISTINCTNumberFROMWorkAmount;

结果:Number-------20080012008002【例3.20】查询所有年龄在20岁以下的雇员姓名及其年龄。SELECTName,AgeFROMEmployeeWHEREAge<20;【例3.21】查询年龄在20~23岁(包括20岁和23岁)之间的雇员姓名、部门和年龄。SELECTName,Department,AgeFROMEmployeeWHEREAgeBETWEEN20AND23;【例3.22】查询一车间、三车间和二车间的雇员姓名和性别。SELECTName,SexFROMEmployeeWHEREDepartmentIN('一车间','三车间','二车间');3.4.1单表查询(序)选择元组时还可以用[NOT]LIKE‘<匹配串>’[ESCAPE‘<换码字符>’]进行字符串匹配。通配符有如下两种:_:也就是下横线,代表任意单个字符;例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如aab、abb、avb等都满足该匹配串。%:也就是百分号,代表任意长度的字符串,也可以是长度可以为0的空串;例:a%b表示以a开头,以b结尾的任意长度的字符串。如ab、afb、agghhb等都满足该匹配串。ESCAPE短语:当用户要查询的字符串本身就含有%或_时,要使用ESCAPE'<换码字符>'短语对通配符进行转义。3.4.1单表查询(序)匹配模板为含通配符的字符串时的例子:【例3.23】查询所有姓刘雇员的姓名、职工号和性别。SELECTName,Number,SexFROMEmployeeWHERENameLIKE'刘%';使用换码字符将通配符转义为普通字符的例子:【例3.24】Job表见表3-3,查询工作名称以"_1"结尾的工作的详细情况。SELECT*FROMJobWHEREJnameLIKE'%\_1'ESCAPE'\';3.4.1单表查询(序)(4)使用集函数。集函数有如下主要的五类:COUNT([DISTINCT|ALL]*)或COUNT([DISTINCT|ALL]<列名>):用于计数。SUM([DISTINCT|ALL]<列名>):用于计算总和。AVG([DISTINCT|ALL]<列名>):用于计算平均值。MAX([DISTINCT|ALL]<列名>):用于求最大值。MIN([DISTINCT|ALL]<列名>):用于求最小值。DISTINCT短语:在计算时要取消指定列中的重复值。ALL短语:不取消重复值;ALL为缺省值。3.4.1单表查询(序)【例3.29】查询雇员总人数。SELECTCOUNT(*)FROMEmployee;【例3.30】查询完成了一定的工作量的雇员人数。SELECTCOUNT(DISTINCTNumber)FROMWORKAMOUNTWHERRAMOUNTISNOTNULL;【例3.31】计算干1号工作的雇员平均工作量。SELECTAVG(Amount)FROMWORKAMOUNTWHEREJobNumber='1';3.4.1单表查询(序)(5)对查询结果分组。使用GROUPBY子句对元组进行分组,细化集函数的作用对象,如果未对查询结果分组,集函数将作用于整个查询结果,对查询结果分组后,集函数将分别作用于每个组。【例3.32】查询各工作号及相应的干该项工作的人数。SELECTJobNumber,COUNT(Number)FROMWORKAMOUNTGROUPBYJobNumber;结果:JobNumberCOUNT(Number)

1222343444333.4.2复杂查询(1)连接查询:同时涉及多个表的查询称为连接查询,一般格式如下:[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>连接操作的执行过程有三种:1)嵌套循环法(NESTED-LOOP):首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中的一个元组。表2全部查找完后,再找表1中的第二个元组,重复上述操作,直到表1中的全部元组都处理完毕。2)排序合并法(SORT-MERGE):常用于=连接。首先按连接属性对表1和表2排序,对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中的一个元组。重复上述操作,直到表1或表2中的全部元组都处理完毕为止。3)索引连接(INDEX-JOIN):对表2按连接字段建立索引,对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中的一个元组。3.4.2复杂查询(序)SQL中连接查询主要有以下类型:1)广义笛卡尔积2)条件连接查询3)自身连接。4)外连接(OuterJoin)3.4.2复杂查询(序)2)条件连接查询:带连接谓词的连接,格式如下:[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>【例3.34】查询每个雇员及其完成工作的情况。SELECTEmployee.*,WORKAMOUNT.*FROMEmployee,WORKAMOUNTWHEREEmployee.Number=WORKAMOUNT.Number;3.4.2复杂查询(序)3)自身连接。一个表与自己进行连接,需要给表起别名以示区别。【例3.35】查询每一项工作的间接先修工作(即先行工作的先行工作)。Job表的内容见表3-3,其中Cpno列就是该工作的先行工作。SELECTFIRST.JobNumber,SECOND.CpnoFROMJobFIRST,JobSECONDWHEREFIRST.Cpno=SECOND.JobNumber;FIRST、SECOND都是Job表的别名。查询结果:1735563.4.2复杂查询(序)4)外连接(OuterJoin):以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。【例3.36】查询每个雇员及其完成一定的工作量的情况,包括没有完成一定的工作量的雇员。用外连接操作实现。SELECTEmployee.Number,Name,Sex,Age,Department,JobNumber,AmountFROMEmployee,WORKAMOUNTWHEREEmployee.Number=WORKAMOUNT.Number(*);结果如下:Employee.Number Name Sex Age Department JobNumber Amount 2008001 张鹏 男 20 二车间 1 922008001 张鹏 男 20 二车间 2 852008001 张鹏 男 20 二车间 3882008002 李敏 女 19 一车间 2 902008002 李敏 女 19 一车间 3 802008003 王敏 女 18 三车间2008004 周青 男 19 一车间3.4.2复杂查询(序)(2)嵌套查询。一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。SELECTName外层查询/父查询FROMEmployeeWHERENumberIN(SELECTNumber内层查询/子查询

FROMWORKAMOUNWHEREJobNumber='2');3.4.2复杂查询(序)1)带有IN谓词的子查询。【例3.37】查询与“李敏”在同一个部门工作的雇员。构造嵌套查询:将第一步查询嵌入到第二步查询的条件中。SELECTNumber,Name,DepartmentFROMEmployeeWHEREDepartmentIN(SELECTDepartmentFROMEmployeeWHEREName='李敏');结果为:NumberNameDepartment2008001李敏一车间2008004周青一车间3.4.2复杂查询(序)2)带有EXISTS谓词的子查询。带有EXISTS谓词的子查询可以分为以下5种情况。a.EXISTS谓词:即存在量词

,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则返回真值;若内层查询结果为空,则返回假值。由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。【例3.39】用嵌套查询所有完成了1号工作的雇员姓名。

SELECTNameFROMEmployeeWHEREEXISTS(SELECT*FROMWORKAMOUNT/*相关子查询*/WHERENumber=Employee.NumberANDJobNumber='1');3.4.2复杂查询(序)b.NOTEXISTS谓词。【例3.40】查询没有完成1号一定的工作量的雇员姓名。

SELECTNameFROMEmployeeWHERENOTEXISTS(SELECT*FROMWORKAMOUNTWHERENumber=Employee.NumberANDJobNumber='1');c.不同形式的查询间的替换。【例3.41】查询与“李敏”在同一个部门工作的雇员。可以用带EXISTS谓词的子查询替换。

SELECTNumber,Name,DepartmentFROMEmployeeS1WHEREEXISTSSELECT*FROMEmployeeS2WHERES2.Department=S1.DepartmentANDS2.Name='李敏';3.4.2复杂查询(序)(3)集合查询。标准SQL直接支持的集合操作只有并操作(UNION)。而一般商用数据库支持的集合操作种类有并操作(UNION)、交操作(INTERSECT)、差操作(MINUS)。1)并操作:就是将两个以上的查询结果合并起来。语法形式:

<查询块> UNION <查询块>【例3.42】查询二车间的雇员及年龄不大于29岁的雇员。SELECT*FROMEmployeeWHEREDepartment='二车间'UNIONSELECT*FROMEmployeeWHEREAge<=29;3.4.2复杂查询(序)2)交操作:标准SQL中没有提供集合交操作,但可用其他方法间接实现。【例3.43】查询完成工作1的雇员集合与完成工作2的雇员集合的交集。本例实际上是查询既完成了一定的工作1又完成了一定的工作2的雇员。SELECTNumberFROMWORKAMOUNTWHEREJobNumber='1'ANDNumberIN(SELECTNumberFROMWORKAMOUNTWHEREJobNumber='2');3)差操作:标准SQL中也没有提供集合差操作,同样可用其他方法间接实现。【例3.44】查询Employee表中职工号与WORKAMOUNT表中职工号的差集。本例实际上是查询未分配工作的职工号。SELECTDISTINCTNumberFROMEmployeeWHERENumberNOTIN(SELECTNumberFROMWORKAMOUNT);3.4.2复杂查询(序)(1)插入子查询结果。语句格式:INSERTINTO<表名>[(<属性列1>[,<属性列2>…)]

子查询;【例3.45】对每一个部门,求雇员平均年龄,并把结果存入数据库。第一步:建表;CREATETABLEDeptage(DepartmentCHAR(15)/*部门名*/AvgageSmaLLINT);/*雇员平均年龄*/第二步:插入数据;INSERTINTODeptage(Department,Avgage)SELECTDepartment,AVG(Age)FROMEmployeeGROUPBYDepartment;3.4.2复杂查询(序)(2)带子查询的修改语句。在WHERE子句中嵌入SELECT子句。【例3.46】将二车间全体雇员的工作量置零。UPDATEWORKAMOUNTSETAmount=0WHERE'二车间'=(SELECTDepartmentFROMEmployeeWHEREEmployee.Number=WORKAMOUNT.Number);(3)带子查询的删除语句。在WHERE子句中嵌入SELECT子句。【例3.47】删除二车间所有雇员的工作量记录。DELETEFROMWORKAMOUNTWHERE'二车间'=(SELETEDepartmentFROMEmployeeWHEREEmployee.Number=WORKAMOUNT.Number);3.4.3视图视图是从一个或几个基本表(或视图)导出的表,是虚表。合理使用视图能够带来许多好处,主要有以下几方面:(1)视图能够简化用户的操作。可以通过定义视图,使用户眼中的数据库结构简单、清晰,并且可以简化用户的数据查询操作。(2)视图使用户能以多种角度看待同一数据视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户使用同一个数据库时,这种灵活性是非常重要的,可以根据用户的不同,在相同的基本表上制作出不同的视图。(3)视图对重构数据库提供了一定程度的逻辑独立性。关系数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”或“水平”地分成多个表。(4)通过视图隐藏数据有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使数据不出现在不应看到这些数据的用户视图上,视图显示剪裁过的数据,使数据隐藏在查询的背后。3.4.3视图(序)(1)建立视图。语句格式:CREATEVIEW<视图名>[(<列名>[,<列名>]…)]AS<子查询>[WITHCHECKOPTION];组成视图的属性列名全部省略或全部指定;若全部省略,则由子查询中SELECT目标列中的诸字段组成;若明确指定视图的所有列名,则可以是如下几种情况:1)某个目标列是集函数或列表达式。2)目标列为*。3)多表连接时选出了几个同名列作为视图的字段。4)需要在视图中为某个列启用新的更合适的名字。3.4.3视图(序)【例3.48】建立一车间雇员的视图。CREATEVIEW一车间_EmployeeASSELECTNumber,Name,AgeFROMEmployeeWHEREDepartment='一车间';【例3.49】建立一车间雇员视图,要求透过该视图进行的更新操作只涉及部门雇员。CREATEVIEW一车间_EmployeeASSELECTNumber,Name,AgeFROMEmployeeWHEREDepartment='一车间'WITHCHECKOPTION;3.4.3视图(序)视图也可以基于多个基表,看下面的例子。【例3.50】建立一车间完成了1号工作的雇员视图。CREATEVIEW一车间_S1(Number,Name,Amount)ASSELECTEmployee.Number,Employee.Name,WORKAMOUNT.AmountFROMEmployee,WORKAMOUNTWHEREDepartment='一车间'ANDEmployee.Number=WORKAMOUNT.NumberANDWORKAMOUNT.JobNumber='1';视图还可以基于视图。【例3.51】建立一车间完成了1号工作且工作量在90分以上的雇员的视图。CREATEVIEW一车间_S2ASSELECTNumber,Name,AmountFROM一车间_S1WHEREAmount>=90;视图中也可以带表达式。【例3.52】定义一个反映雇员出生年份的视图。CREATEVIEWBT_S(Number,Name,Sbirth)ASSELECTNumber,Name,2008-AgeFROMEmployee

温馨提示

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

最新文档

评论

0/150

提交评论