当前位置:文档之家› 数据库系统概论第三次作业及参考答案

数据库系统概论第三次作业及参考答案

答案仅供参考,严禁拷贝 第三次作业
数据库系统概论第三次作业及参考答案
1、有一张记录学生成绩的数据表如下所示,试使用嵌有SQL的C++语言完成计算每个学生
成绩等次。其中:
学生成绩表
name course creditgrade
李明 操作系统 4 89
王晓强 数据库系统 3 95
夏春秋 程序设计 5 88
将GRADE按下列规则改成GRADEPOINT:
GRADE(G) GRADEPOINT(GP)
G≥85 4
85﹥G≥75 3
75﹥G≥60 2
G<60 1
答:将GRADE改成GRADEPOINT的C++程序如下:
#define NO-TUPLE ! (strcmp (SQLSTATE,”02000”))
void CaLGRADE ( ) {
EXEC SQL BEGIN DECLARE SECTION;
Char SQLSTATE [6];
int name, course, grade;
EXEC SQL END DECLARE SECTION;
EXEC SQL ALTER TABLE GRADETABLE ADD GRADEPOINT int; /增加1列
EXEC SQL DECLARE GRADECursor CURSOR FOR
SELECT NAME, COURSE, GRADE FROM GRADEPOINT;
EXEC SQL OPEN GRADECursor;
while (1) {
EXEC SQL FETCH FROM GRADECursor
INTO :name, :course , :grade ;
if (NO-TUPLE) break;
if ( :grade>=85)
EXEC SQL UPDATE GRADEPOINT
SET GRADEPOINT=4
WHERE NAME =:name AND COURSE =:course;
Else
if (:grade<85 AND :grade>=75 )
EXEC SQL UPDATE GRADEPOINT
SET GRADEPOINT=3
WHERE NAME =:name AND COURSE =:course;
Else
If ( :grade<75 AND :grade>=60 )
EXEC SQL UPDATE GRADEPOINT
SET GRADEPOINT=2
认真完成作业 取得好的成绩 1
答案仅供参考,严禁拷贝 第三次作业
WHERE NAME =:name AND COURSE =:course;
Else EXEC SQL UPDATE GRADEPOINT
SET GRADEPOINT=1
WHERE NAME =:name AND COURSE =:course;
}
EXEC SQL ALTER TABLE GRADETABLE DROP GRADE;
EXEC SQL CLOSE CURSOR GRADECursor;
}

2、产品数据库模式如下:用C++或者其它熟悉的宿主语言编写如下的嵌入式SQL查询:
询问用户所要求的价格,找出与要求的价格最接近(价格差小于1000元)的PC机。打印
符合要求的PC机的制造商(maker)、型号(model)、速度(speed)和价格。
Product表
maker model Type


PC表
model speed ram hd cd price


Laptop表
model speed ram hd cd price


Printer表
model color type price


答:用C++语言编写程序如下:
#define NO-TUPLE ! (strcmp (SQLSTATE,”02000”))
void closestMatchPC( ) {
EXEC SQL BEGIN DECLARE SECTION;
char maker1[30], SQLSTATE[6];
int targetPrice, model1, speed1, price1;
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE pcCursor CURSOR FOR
SELECT model, speed, price FROM PC;
EXEC SQL OPEN pcCursor;
cout<<”Input target price.” /询问用户所要求的价格
cin>>targetPrice; /用户输入价格存入到targetPrice共享变量
while (1) {
EXEC SQL FETCH FROM pcCursor
INTO :model1, :speed1, :price1;
if (NO-TUPLE) brea

k;
if ((targetPrice-price1<1000) || (price1-targetPrice<1000)) {
认真完成作业 取得好的成绩 2
答案仅供参考,严禁拷贝 第三次作业
EXEC SQL SELECT maker
INTO :maker1
FROM Product
WHERE model=:model1;
cout<}
}
EXEC SQL CLOSE CURSOR pcCursor;
}

3、结合2题的产品数据库模式,用嵌入式SQL和C++语言编写如下程序:给出一个型号,
然后从Product和PC两个关系中删除该型号的元组。
答:用C++语言编写程序如下:
EXEC SQL BEGIN DECLARE SECTION;
int model1;
EXEC SQL END DECLARE SECTION;
Void deleteTuple ( ) {
cout<<”Input model number.”;
cin>>model1;
EXEC SQL DELETE FROM Product
WHERE model=:model1;
EXEC SQL DELETE FROM PC
WHERE model=:model1;
EXEC SQL COMMIT;

4、对于电影数据库,用含有键码和外键码说明的SQL建表语句建立电影表Movie(Title,Year,
Length)、演员表Actor和电影主演表Act。
答:
CREATE TABLE Movie(
Title CHAR(30),
Year INT,
Length INT
PRIMARY KEY (Title,Year)
);
CREATE TABLE Actor(
Name CHAR(20) PRIMARY KEY,
Address VARCHAR(30),
Gender CHAR(1),
Birthdate DATE
);
CREATE TABLE Acts(
MovieTitle CHAR(30),
MovieYear INT,
ActorName CHAR(20),
认真完成作业 取得好的成绩 3
答案仅供参考,严禁拷贝 第三次作业
PRIMARY KEY (MovieTitle,MovieYear,ActorName)
FOREIGN KEY (MovieTitle,MovieYear)
REFERENCES Movie (Title,Year)
FOREIGN KEY (ActorName)
REFERENCES Actor (Name)
);

5、对于电影关系Movie (title,year,length,inColor,studioName)中的属性,写出下列约束:
年份不能在1895年以前。电影长度不能短于60,也不能长于240。
答:在建表语句中增加说明约束的两条语句:
CREATE TABLE Movie(
...
year INT CHECK (year>=1895),
length INT CHECK (length>=60 AND length<=240),
...
);

6、对于电影Movie、演员Actor、和电影主演Acts关系,如下所示:
Movie表
title year lengthinColorstudioname


Actor表
name address genderbirthyear


Acts表
MovietitleMovieyearActorname


写出下列基于元组的检验(CHECK)约束:
(1)1939年以前制作的电影不会是彩色的。
(2)演员不会出现在他们出生之前制作的电影中。
答:在两个建表语句中增加说明约束的语句:
(1)CREATE TABLE Movie(
...
CHECK (NOT incolor OR year>=1939)
);
(2)CREATE TABLE Actor(
...
birthYear INT,
CHECK ( name NOT IN ( SELECT actorName FROM Acts)
OR birthYear (SELECT movieYear FROM Acts
认真完成作业 取得好的成绩 4
答案仅供参考,严禁拷贝 第三次作业
WHERE actorName=name))
);
CREATE TABLE Acts(
CHECK (actorName NOT IN ( SELECT name FROM A

ctor)
OR movieYear > (SELECT birthYear FROM Actor
WHERE name= actorName ))
);

7、利用产品(Product)类及其三个子类PC机(PC)、便携式电脑(Laptop)、打印机(Printer)
的关系模式,用OQL写出下列查询:
(1)找出价格在8000元的所有PC机。
(2)找出内存至少64M字节、硬盘至少10G字节的PC机制造商。
(3)找出至少制造两种不同型号激光打印机的制造商。
(4)找出PC机的平均速度。
答:(1)SELECT p.model FROM PCs p WHERE p.price<8000;
(2)SELECT p.model FROM PCs p WHERE p.ram>=64 AND p.hd>=10;
(3)SELECT DISTINCT p1.maker FROM Printers p1,Printers p2
WHERE p1.maker=p2.maker AND p1.printertype=”laser”
AND p2.printertype=”laser” AND p1.model(4)AVG (SELECT p.speed FROM PCs p );

8、利用产品数据库,写出用OQL扩充了的C++语句来完成下列操作:
(1)把型号为1001的PC对象赋值宿主变量x。
(2)把内存至少有16M字节的所有便携式电脑对象的集合赋值给宿主变量y。
(3)把售价低于5000元的PC机的平均速度赋值给宿主变量z。
答:(1)x= SELECT p FROM PCs p WHERE p.model=1001;
(2)y= SELECT l FROM Laptops l WHERE l.ram>=16;
(3)z= AVG (SELECT p.speed FROM PCs p WHERE p.price<5000);
认真完成作业 取得好的成绩 5

相关主题
文本预览
相关文档 最新文档