1、223.4 教材习题答案3.1 试述 SQL 语言的特点。答:SQL 语言集数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)功能于一体,主要特点包括:1、综合统一。SQL 语言集数据定义语言 DDL、数据操纵语言 DML、数据控制语言DCL 的功能于一体。2、高度非过程化。用 SQL 语言进行数据操作,只要提出“做什么” ,而无需指明“怎么做” ,因此无需了解存取路径,存取路径的选择以及 SQL 语句的操作过程由系统自动完成。这不仅大大减轻了用户负担,而且有利于提高数据独立性。3、
2、面向集合的操作方式。SQL 语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。4、以同一种语法结构提供两种使用方式。SQL 语言既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互操作使用方式,用户可以在终端键盘上直接键入 SQL 命令对数据库进行操作;作为嵌入式语言,SQL 语句能够嵌入到高级语言的程序中,供程序员设计程序时使用。5、语言简捷,易学易用。SOL 语言功能极强,但由于设计巧妙,语言十分简捷,完成核心功能只用了 9 个动词。SQL 语言接近英语句子,因此容易学习,容易使用。6、支持三级模式结构。
3、SQL 语言支持关系数据库的三级模式结构。其中外模式对应于视图(View),模式对应于基本表,内模式对应于存储文件。3.2 试述 SQL 的定义功能。答:SQL 的数据定义功能包括定义表、定义视图和定义索引。SQL 语言使用 CREATE TABLE 语句建立基本表,ALTER TABLE 语句修改基本表定义,DROP TABLE 语句删除基本表;使用 CREATE INDEX 语句建立索引,DROP INDEX语句删除索引;使用 CREATE VIEW 语句建立视图,DROP VIEW 语句删除视图。3.3 用 SQL 语句建立习题 2.4 中的 4 个表。答:对于供应商表:S(Sno(供应
4、商代码),Sname (供应商名),Status(供应状态) ,City(供应商所在城市)建 S 表CREATE TABLE S(Sno CHAR(4),Sname CHAR(10),Status CHAR(4),City CHAR(20));对于零件表:P(Pno(零件代码),Pname(零件名),Color(颜色),Weight(重量)建 P 表23CREATE TABLE P(Pno CHAR(4),Pname CHAR(20),Color CHAR(4),Weight INT);对于工程项目表:J(Jno(工程项目代码) ,Jname(工程项目名) ,City(工程项目所在的城市) )
5、建 J 表CREATE TABLE J(Jno CHAR(4),Jname CHAR(20),City CHAR(20));对于零件供应情况表:SPJ(Sno(供应商代码),Pno(零件代码),Jno(工程项目代码) ,QTY(供应数量)。建 SPJ 表CREATE TABLE SPJ(Sno CHAR(4), Pno CHAR(4),Jno CHAR(4),QTY INT);3.4 针对习题 3.3 中建立的 3 个表,试用 SQL 语言完成习题 2.4 中的查询。 找出供应工程 J1 零件的供应商号;答:SELECT SnoFROM SPJWHERE Jno=J1; 找出供应工程 J1 零
6、件 P1 的供应商号;答:SELECT SnoFROM SPJWHERE Jno=J1 AND Pno=P1; 找出供应工程 J1 红色零件的供应商号;答:SELECT SnoFROM SPJWHERE Jno=J1 AND Pno IN(SELECT PnoFROM PWHERE Color=绿);或SELECT SnoFROM SPJ ,P24WHERE Jno=J1 AND SPJ.Pno=P.Pno AND P.Color=绿); 找出没有使用杭州供应商生产的绿色零件的工程号。答:SELECT JnoFROM JWHERE NOT EXISTS(SELECT *FROM SPJWHER
7、E SPJ.Jno=J.Jno AND Sno IN(SELECT SnoFROM SWHERE City=杭州)AND Pno IN(SELECT PnoFROM PWHERE Color=绿);或SELECT JnoFROM JWHERE NOT EXISTS(SELECT *FROM SPJ,S,PWHERE SPJ.Jno=J.Jno AND SPJ.Sno=S.SnoAND SPJ.Pno=P.Pno AND S. City=杭州AND P.Color=绿); 找出至少用了 S2 供应商所供应的全部零件的工程号。答:SELECT DISTINCT JnoFROM SPJ SPJZWH
8、ERE NOT EXISTS(SELECT *FROM SPJ SPJXWHERE Sno=S2AND NOT EXISTS(SELECT *FROM SPJ SPJYWHERE SPJY.Pno=SPJX.Pno 25AND SPJY.Jno=SPJZ.Jno); 找出供应红色的 P1 零件且其供应量大于 200 的供应商号。答:SELECT JnoFROM P,SPJWHERE P.Pno=SPJ.Pno AND P.Pno=P1 AND SPJ.QTY=200;3.5 针对习题 3.3 中的 4 个表,试用 SQL 语言完成以下各项操作。(1) 找出所有供应商的姓名和所在城市。答:SEL
9、ECT Sname,CityFROM S;(2) 找出所有零件的名称、颜色、重量。答:SELECT Pname,Color,WeightFROM P;(3) 找出使用供应商 S2 所供应零件的工程号。答:SELECT JnoFROM SPJWHERE Sno=S2;(4) 找出工程项目 J3 使用的各种零件的名称及其数量。答:SELECT P,Pname,SPJ.QTYFROM P,SPJWHERE P.Pno=SPJ.PnoAND SPJ.Jno=J3;(5) 找出杭州厂商供应的所有零件号码。答:SELECT DISTINCT PnoFROM SPJWHERE Sno IN( SELECT
10、SnoFROM S26WHERE City=杭州);(6) 找出使用杭州产的零件的工程名称。答:SELECT JnameFROM J,SPJ,SWHERE J.Jno=SPJ.Jno AND SPJ.Sno=S.SnoAND S.City= 杭州;或SELECT JnameFROM JWHERE Jno IN(SELECT JnoFROM SPJ,SWHERE SPJ.Sno=S.Sno AND S.City= 杭州);(7) 找出没有供应天津产的零件的工程号。答:SELECT JnoFROM JWHERE NOT EXISTS( SELECT *FROM SPJWHERE SPJ.Jno=J
11、.Jno AND Sno IN( SELECT SnoFROM SWHERE City= 天津);或SELECT JnoFROM JWHERE NOT EXISTS( SELECT *FROM SPJ,SWHERE SPJ.Jno=J.Jno AND SPJ.Sno=S.SnoAND City= 天津);27(8) 把全部红色零件的颜色改成蓝色。答:UODATE PSET Color= 蓝WHERE Color= 红;(9) 由供应商 S4 供给 J3 零件 P5 改为由 S3 供应,请做必要的修改。答:UPDATE SPJSET Sno=S3WHERE Sno=S4 AND Jno=J3 A
12、ND Pno=P5;(10)从供应商关系中删除 S3 的记录,并从供应情况关系中删除相应的记录。答:DELETEFROM SPJWHERE Sno=S3;DELETEFROM SWHERE Sno=S2;(11)请将(S2 ,J6,P4 ,300)插入到供应情况关系中。答:INSERT INTO SPJ(Sno,Jno,Pno,QTY)VALUE (S2,J6,P4,300);或INSERT INTO SPJVALUE (S2,J6,P4,300);3.6 什么是基本表? 什么是视图? 两者的区别和联系是什么?答:基本表是数据库中本身独立存在的表,每个基本表对应一个关系模式。在 SQL 中一个
13、关系就对应一个基本表。一个(或多个)基本表对应一个存储文件,一个基本表可以建立若干索引,它们都依附于基本表且存放在存储文件中。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义及其关联的基本表名等信息而不存放视图对应的数据,这些数据仍然存放在导出视图的基本表中。但 SQL 在查询视图时与基本表完全相同,且用户可28以在视图上再定义视图。但用视图对数据库中的数据进行增、删、改等更新操作时有一定的限制。3.7 试述视图的优点。答: 视图能够简化用户的操作。视图使用户可以将注意力集中在所关心的数据上并简化用户的数据查询操作。 视图使用户能够以多角度
14、看待同一数据。视图可使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性显得非常重要的。 视图为数据库重构提供了一定程度的逻辑独立性。数据的逻辑独立性是指当数据库重新构造时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响,而视图就为数据库重构提供了一定程度的逻辑独立性。 视图能够对数据提供安全保护。对不同的用户定义不同的视图,可使机密数据不出现在不应该看到这些数据的用户视图上,达到对机密数据的安全保护。3.8 所有的视图是否都可以更新? 为什么?答:不是。视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新,因为有些视
15、图的更新不能惟一有意义地转换成对相应基本表的更新,所以,并不是所有的视图都是可更新的。3.9 哪类视图是可以更新的,哪类视图是不可更新的? 各举一例。答:基本表的行列子集视图一般是可以更新的。如数据库原理与应用3.5.3 中的例3.65。例、 将数学系学生视图 C_Student 中学号为 S05 的学生姓名改为 “黄海” 。UPDATE C_StudentSET Sname=黄海WHERE Sno=S05;DBMS 自动转换为对基本表的更新语句如下:UPDATE StudentsSET Sname=黄海WHERE Sno=S05 AND Sdept=数学;若视图的属性来自集函数、表达式,则该
16、视图肯定是不可以更新的。如数据库原理与应用3.5.3 中的例 3.66。例、向数学系学生视图 C_Student 中插入一个新的学生记录,其中学号为“S09” ,姓名为“王海” ,年龄为 20 岁。INSERTINTO C_StudentVALUES (S09,王海,20, 数学);29由于在定义 C_Student 是应用了“WITH CHECK OPTION”短语,其作用是限制 Sdept的值必须是“数学”才允许由视图 C_Student 插入,若换成其它任何字符,DBMS 都拒绝执行插入操作。若定义 C_Student 是不用“WITH CHECK OPTION”这个短语,则以上VALU
17、ES 短语中改为 (S09,王海,20, 自动化)仍然可以完成插入操作,但用 SELECT * FROM C_Student 命令则看不到刚插入的元组。3.10 试述某个你熟悉的实际系统中对视图更新的规定。答:(略)因为不同的系统对视图的更新规定是不同的,学员必须了解你所用系统对视图更新的规定,所以我们无法给出一个相对标准的答案。3.11 请为一建工程项目建立一个供应情况的视图,包括供应商代码(Sno)、零件代码(Pno) 、供应商名称(Sname)、供应数量(Qty)。针对该视图完成下列查询:(1) 找出一建工程项目使用的各种零件代码及其数量。(2) 找出供应商 S2 的供应情况。答:建视图
18、CREATE VIEW V_SPJ ASSELECT Sno,Pno,Sname,QtyFROM SPJWHERE Jno=(SELECT JnoFROM JWHERE Jname= 一建 );对该视图进行查询:(1) 找出一建工程项目使用的各种零件代码及其数量。答:SELECT Pno,QtyFROM V_SPJ ;(2) 找出供应商 S2 的供应情况。答:SELECT Pno,QtyFROM V_SPJ ;WHERE Sno=S2;(3) 找出供应零件 P2 且供应数量大于 100 的供应商名。答:SELECT Pname30FROM V_SPJ ;WHERE Pno=P2 AND Qty
19、100;3.12 针对习题 3.3 建立的表,用 SQL 语言完成以下各项操作:(1) 把对表 S 的 INSERT 权限授予用户 ZhangYong,并允许他再将此权限授予其他用户。答:GRANT INSERTON TABLE STO ZhangYongWITH GRANT OPTION;(2) 把查询 SP 表和修改 Qty 属性的权限授给用户 LiMing。答:GRANT SELECT , UPDATE(QTY)ON TABLE SPJTO LiMing;3.13 嵌入式 SQL 是如何解决数据库工作单元与源程序工作单元之间通讯的?答:在 SQL 语句前加上前缀 EXEC SQL,SQL
20、 语句的结束标志则随主语句的不同而不同。3.14 在嵌入式 SQL 中是如何协调 SQL 语言的集合处理方式和主语言的单记录处理方式的?答:用游标来协调这两种不同的处理方式。游标区是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋给主变量,交由主语言进一步处理。3.15 试述空值的概念,空值在运算中会带来什么问题?答:SQL/DS 支持空值的概念。空值是“不存在”的值,即未知的或不可用的。空值在运算中会带来结果的不确定性问题。例、如果算术表达式中任一运算分量为空值,则表达式的值为空值。如 x+y 中,若 x 为空值,则 x+y 的值为空。在算术比较中,有一值为空值,表达式的值为“?” 。