223.4教材习题答案3.1试述SQL语言的特点。答:SQL语言集数据查询(DataQuery)、数据操纵(DataManipulation)、数据定义(DataDefinition)和数据控制(DataControl)功能于一体,主要特点包括:1、综合统一。SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体。2、高度非过程化。用SQL语言进行数据操作,只要提出“做什么”,而无需指明“怎么做”,因此无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不仅大大减轻了用户负担,而且有利于提高数据独立性。3、面向集合的操作方式。SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。4、以同一种语法结构提供两种使用方式。SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互操作使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言的程序中,供程序员设计程序时使用。5、语言简捷,易学易用。SOL语言功能极强,但由于设计巧妙,语言十分简捷,完成核心功能只用了9个动词。SQL语言接近英语句子,因此容易学习,容易使用。6、支持三级模式结构。SQL语言支持关系数据库的三级模式结构。其中外模式对应于视图(View),模式对应于基本表,内模式对应于存储文件。3.2试述SQL的定义功能。答:SQL的数据定义功能包括定义表、定义视图和定义索引。SQL语言使用CREATETABLE语句建立基本表,ALTERTABLE语句修改基本表定义,DROPTABLE语句删除基本表;使用CREATEINDEX语句建立索引,DROPINDEX语句删除索引;使用CREATEVIEW语句建立视图,DROPVIEW语句删除视图。3.3用SQL语句建立习题2.4中的4个表。答:对于供应商表:S(Sno(供应商代码),Sname(供应商名),Status(供应状态),City(供应商所在城市))建S表CREATETABLES(SnoCHAR(4),SnameCHAR(10),StatusCHAR(4),CityCHAR(20));对于零件表:P(Pno(零件代码),Pname(零件名),Color(颜色),Weight(重量))建P表23CREATETABLEP(PnoCHAR(4),PnameCHAR(20),ColorCHAR(4),WeightINT);对于工程项目表:J(Jno(工程项目代码),Jname(工程项目名),City(工程项目所在的城市))建J表CREATETABLEJ(JnoCHAR(4),JnameCHAR(20),CityCHAR(20));对于零件供应情况表:SPJ(Sno(供应商代码),Pno(零件代码),Jno(工程项目代码),QTY(供应数量))。建SPJ表CREATETABLESPJ(SnoCHAR(4),PnoCHAR(4),JnoCHAR(4),QTYINT);3.4针对习题3.3中建立的3个表,试用SQL语言完成习题2.4中的查询。⑴找出供应工程J1零件的供应商号;答:SELECTSnoFROMSPJWHEREJno=’J1’;⑵找出供应工程J1零件P1的供应商号;答:SELECTSnoFROMSPJWHEREJno=’J1’ANDPno=’P1’;⑶找出供应工程J1红色零件的供应商号;答:SELECTSnoFROMSPJWHEREJno=’J1’ANDPnoIN(SELECTPnoFROMPWHEREColor=’绿’);或SELECTSnoFROMSPJ,P24WHEREJno=’J1’ANDSPJ.Pno=P.PnoANDP.Color=’绿’);⑷找出没有使用杭州供应商生产的绿色零件的工程号。答:SELECTJnoFROMJWHERENOTEXISTS(SELECT*FROMSPJWHERESPJ.Jno=J.JnoANDSnoIN(SELECTSnoFROMSWHERECity=’杭州’)ANDPnoIN(SELECTPnoFROMPWHEREColor=’绿’));或SELECTJnoFROMJWHERENOTEXISTS(SELECT*FROMSPJ,S,PWHERESPJ.Jno=J.JnoANDSPJ.Sno=S.SnoANDSPJ.Pno=P.PnoANDS.City=’杭州’ANDP.Color=’绿’);⑸找出至少用了S2供应商所供应的全部零件的工程号。答:SELECTDISTINCTJnoFROMSPJSPJZWHERENOTEXISTS(SELECT*FROMSPJSPJXWHERESno=’S2’ANDNOTEXISTS(SELECT*FROMSPJSPJYWHERESPJY.Pno=SPJX.Pno25ANDSPJY.Jno=SPJZ.Jno));⑹找出供应红色的P1零件且其供应量大于200的供应商号。答:SELECTJnoFROMP,SPJWHEREP.Pno=SPJ.PnoANDP.Pno=’P1’ANDSPJ.QTY=200;3.5针对习题3.3中的4个表,试用SQL语言完成以下各项操作。(1)找出所有供应商的姓名和所在城市。答:SELECTSname,CityFROMS;(2)找出所有零件的名称、颜色、重量。答:SELECTPname,Color,WeightFROMP;(3)找出使用供应商S2所供应零件的工程号。答:SELECTJnoFROMSPJWHERESno=’S2’;(4)找出工程项目J3使用的各种零件的名称及其数量。答:SELECTP,Pname,SPJ.QTYFROMP,SPJWHEREP.Pno=SPJ.PnoANDSPJ.Jno=’J3’;(5)找出杭州厂商供应的所有零件号码。答:SELECTDISTINCTPnoFROMSPJWHERESnoIN(SELECTSnoFROMS26WHERECity=’杭州’);(6)找出使用杭州产的零件的工程名称。答:SELECTJnameFROMJ,SPJ,SWHEREJ.Jno=SPJ.JnoANDSPJ.Sno=S.SnoANDS.City=’杭州’;或SELECTJnameFROMJWHEREJnoIN(SELECTJnoFROMSPJ,SWHERESPJ.Sno=S.SnoANDS.City=’杭州’);(7)找出没有供应天津产的零件的工程号。答:SELECTJnoFROMJWHERENOTEXISTS(SELECT*FROMSPJWHERESPJ.Jno=J.JnoANDSnoIN(SELECTSnoFROMSWHERECity=’天津’));或SELECTJnoFROMJWHERENOTEXISTS(SELECT*FROMSPJ,SWHERESPJ.Jno=J.JnoANDSPJ.Sno=S.SnoANDCity=’天津’);27(8)把全部红色零件的颜色改成蓝色。答:UODATEPSETColor=’蓝’WHEREColor=’红’;(9)由供应商S4供给J3零件P5改为由S3供应,请做必要的修改。答:UPDATESPJSETSno=’S3’WHERESno=’S4’ANDJno=’J3’ANDPno=’P5’;(10)从供应商关系中删除S3的记录,并从供应情况关系中删除相应的记录。答:DELETEFROMSPJWHERESno=’S3’;DELETEFROMSWHERESno=’S2’;(11)请将(S2,J6,P4,300)插入到供应情况关系中。答:INSERTINTOSPJ(Sno,Jno,Pno,QTY)VALUE(S2,J6,P4,300);或INSERTINTOSPJVALUE(S2,J6,P4,300);3.6什么是基本表?什么是视图?两者的区别和联系是什么?答:基本表是数据库中本身独立存在的表,每个基本表对应一个关系模式。在SQL中一个关系就对应一个基本表。一个(或多个)基本表对应一个存储文件,一个基本表可以建立若干索引,它们都依附于基本表且存放在存储文件中。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义及其关联的基本表名等信息而不存放视图对应的数据,这些数据仍然存放在导出视图的基本表中。但SQL在查询视图时与基本表完全相同,且用户可以28在视图上再定义视图。但用视图对数据库中的数据进行增、删、改等更新操作时有一定的限制。3.7试述视图的优点。答:⑴视图能够简化用户的操作。视图使用户可以将注意力集中在所关心的数据上并简化用户的数据查询操作。⑵视图使用户能够以多角度看待同一数据。视图可使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性显得非常重要的。⑶视图为数据库重构提供了一定程度的逻辑独立性。数据的逻辑独立性是指当数据库重新构造时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响,而视图就为数据库重构提供了一定程度的逻辑独立性。⑷视图能够对数据提供安全保护。对不同的用户定义不同的视图,可使机密数据不出现在不应该看到这些数据的用户视图上,达到对机密数据的安全保护。3.8所有的视图是否都可以更新?为什么?答:不是。视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新,因为有些视图的更新不能惟一有意义地转换成对相应基本表的更新,所以,并不是所有的视图都是可更新的。3.9哪类视图是可以更新的,哪类视图是不可更新的?各举一例。答:基本表的行列子集视图一般是可以更新的。如《数据库原理与应用》3.5.3中的例3.65。例、将数学系学生视图C_Student中学号为S05的学生姓名改为“黄海”。UPDATEC_StudentSETSname='黄海'WHERESno='S05';DBMS自动转换为对基本表的更新语句如下:UPDATEStudentsSETSname='黄海'WHERESno='S05'ANDSdept='数学';若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。如《数据库原理与应用》3.5.3中的例3.66。例、向数学系学生视图C_Student中插入一个新的学生记录,其中学号为“S09”,姓名为“王海”,年龄为20岁。INSERTINTOC_StudentVALUES('S09','王海',20,’数学’);由于在定义C_Student是应用了“WITHCHECKOPTION”短语,其作用是限制Sdept29的值必须是“数学”才允许由视图C_Student插入,若换成其它任何字符,DBMS都拒绝执行插入操作。若定义C_Student是不用“WITHCHECKOPTION”这个短语,则以上VALUES短语中改为('S09','王海',20,’自动化’)仍然可以完成插入操作,但用SELECT*FROMC_Student命令则看不到刚插入的元组。3.10试述某个你熟悉的实际系统中对视图更新的规定。答:(略)因为不同的系统对视图的更新规定是不同的,学员必须了解你所用系统对视图更新的规定,所以我们无法给出一个相对标准的答案。3.11请为一建工程项目建立一个供应情况的视图,包括供应商代码(Sno)、零件代码(Pno)、供应商名称(Sname)、供应数量(Qty)。针对该视图完成下列查询:(1)找出一建工程项目使用的各种零件代码及其数量。(2)找出供应商S2的供应情况。答:建视图CREATEVIEWV_SPJASSELECTSno,Pno,Sname,QtyFROMSPJWHEREJno=(SELECTJnoFROMJWHEREJname=’一建’);对该视图进行查询:(1)找出一建工程项目使用的各种零件代码及其数量。答:SELECTPno,QtyFROMV_SPJ;(2)找出供应商S2的供应情况。答:SELECTPno,QtyFROMV_SPJ;WHERESno=