4.假设某“仓库管理”关系型数据库有下列五个关系模式: 零件PART(PNO,PNAME,COLOR,WEIGHT) 项目PROJECT(JNO,JNAME,JDATE) 供应商SUPPLIER(SNO,SNAME,SADDR) 供应P_P(JNO,PNO,TOTAL) 采购P_S(PNO,SNO,QUANTITY)
(1) 试将PROJECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1, PART、P_S、SUPPLIER三个基本表的自然联接定义为一个视图VIEW2。 (2) 试在上述两个视图的基础上进行数据查询: ① 检索上海的供应商所供应的零件的编号和名字。
② 检索项目J4所用零件的供应商编号和名字。 解:
(1) CREATE VIEW VIEWl
AS SELECT A.JNO,JNAME,DATE,C.PNO,PNAME,COLOR,WEIGHT,TOTAL FROM PROJECT A,P_P B,PART C WHERE A.JNO=B.JNO AND B.PNO=C.PNO; CREATE VIEW VIEW2
AS SELECT A.PNO,PNAME,COLOR,WEIGHT,C.SNO,SNAME,SADDR,QUANTITY FROM PART A,P_S B,SUPPLIER C WHERE A.PNO=B.PNO AND B.SNO=C.SNO; (2) ①
SELECT PNO,PNAME FROM VIEW2
WHERE SADDR LIKE ’上海%’; ② SELECT SNO,SNAME
FROM VIEWl,VIEW2
WHERE VIEWl.PNO=VIEW2.PNO AND JNO=’J4’; 5. 对于教务管理数据库中基本表SC,建立视图如下: CREATE VIEW S_GRADE(SNO,C_NUM,AVG_GRADE) AS SELECT SNO,COUNT(CNO),AVG(GRADE) FROM SC GROUP BY SNO
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操 作:
(1) SELECT * FROM S_GRADE (2) SELECT SNO,C_NUM FROM S_GRADE
WHERE AVG_GRADE>80; (3) SELECT SNO,AVG_GRADE FROM S_GRADE
WHERE C_NUM>(SELECT C_NUM FROM S_GRADE SNO=’S2’); (4) UPDATE S_GRADE SET C_NUM=C_NUM+1 WHERE SNO=’S2’ (5) DELETE FROM S_GRADE WHERE C_NUM>4;
解:
答:⑴ 允许查询。相应的操作如下:
SELECT SNO,COUNT(CNO) AS C_NUM,AVG(GRADE) AS AVG_GRADE FROM SC GROUP BY SNO;
⑵ 允许查询。相应的操作如下:
SELECT SNO,COUNT(CNO)AS C_NUM FROM SC GROUP BY SNO
HAVING AVG(GRADE)>80; ⑶ 允许查询。相应的操作如下:
SELECT SNO,AVG(GRADE) AS AVG_GRADE FROM SC GROUP BY SNO
HAVING COUNT(CNO)>(SELECT COUNT(CNO) FROM SC GROUP BY SNO HAVING SNO=’S2’);
⑷ 不允许。C_NUM是对SC中的学生选修课程的门数进行统计,在未更改SC表时,要在视图S_GRADE中更改门数,是不可能的。
⑸ 不允许。使用分组和聚合操作的视图,不允许用户执行更新操作。 6.简述创建索引的必要性和作用。
答:数据库的索引就类似于书籍的目录,如果想快速查找而不是逐页查找指定的内容,可以通过目录中章节的页号找到其对应的内容。类似地,索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致SQL Server搜索表中的所有记录,以获取匹配结果,这样就会大大降低查询的效率。
7.聚集索引和非聚集索引有何种异同? 答:
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。聚集索引即需要对已有表数据重新进行排序(若表中已有数据),即删除原始的表数据后再将排序结果按物理顺序插回,故聚集索引建立完毕后,建立聚集索引的列中的数据已经全部按序排列。一个表中只能包含一个聚集索引,但该索引可以包含多个列。非聚集索引类似书本索引,索引与数据存放在不同的物理区域,建立非聚集索引时数据本身不进行排序。一个表中可以含多个非聚集索引。
相同之处就是它们都是索引,都可以提高数据的查询速度。
8.用T-SQL语句,按数据库JXGL中选修课程表SC的成绩列降序创建一个普通索引(非唯一、非聚集)。
解:
USE JXGL GO
CREATE INDEX SC_GRADE ON SC(GRADE DESC) GO
第8章
1.名词解释:
存储过程 触发器 用户定义函数 答:
存储过程:是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
触发器:是一种对表进行插入、更新、删除的时候会自动执行的特殊存储过程。
用户定义函数:像系统内置函数一样,可以接受参数,执行复杂的操作并将操作结果以值的形式返回,也可以将结果用表格变量返回。
2.对于例5.9教学管理数据库的表S和SC,有下列程序清单,试叙述其功能。
USE JXGL GO
DECLARE @MyNo CHAR(9) SET @MyNo='S7'
IF (SELECT SDEPT FROM S WHERE SNO=@MyNo)='CS' BEGIN
SELECT AVG(GRADE) AS '平均成绩' FROM SC
WHERE SNO=@MyNo
END
ELSE
PRINT '学号为'+@MyNo+'的学生不存在或不属于计算机科学系' GO
答:输入一个学生的学号,如果该学生属于计算机科学系则输出该学生的平均成绩,否则输出:该学号的学生不存在或不属于计算机科学系的提示。
3.简述存储过程与触发器的区别。
答:触发器与存储过程可以说是非常相似,可以说是一种变种的存储过程,触发器和存储过程一样都是SQL语句集。存储过程执行后驻留在计算机的高速缓冲区中,利用存储过程可以提高程序的效率,但存储过程只能通过调用来运行,可以有返回的状态值,存储过程可以在程序端调用执行。触发器是不可以在程序端调用的,它是SQL服务器端自动运行。触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。
4.AFTER触发器和INSTEAD OF触发器有什么不同?
答:AFTER触发器要求只有执行某一操作INSERT、UPDATE、DELETE之后触发器才被触发,且只能定义在表上,也可以针对表的同一操作定义多个触发器以及它们触发的顺序。而INSTEAD OF触发器表示并不执行其定义的操作(INSERT、UPDATE、DELETE)而仅是执行触发器本身。既可以在表上定义INSTEAD OF触发器,也可以在视图上定义,但对同一操作只能定义一个INSTEAD OF触发器。
5.在教学管理数据库中,创建一个名为STU_AGE的存储过程,该存储过程根据输入的学号,输出该学生的出生年份。
解:
USE JXGL GO
CREATE PROCEDURE STU_AGE @S_NAME CHAR(8) AS
SELECT YEAR(GETDATE()-AGE) AS 'YEAR' FROM S