视图和索引(数据库实验4).doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流视图和索引(数据库实验4).精品文档.数据库基础与实践实验报告实验四 视图和索引 班级:惠普测试142 学号:1408090213 姓名:闫伟明日期:2016-11-131 实验目的:1) 掌握SQL进行视图创建的方法;2) 掌握SQL进行视图更新的方法,理解视图更新受限的原因;3) 掌握SQL进行索引创建及删除的方法。2 实验平台:操作系统:Windows xp。实验环境:SQL Server 2000以上版本。3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。1. 定义视图V_TCS(定义时不加with check option),存放全部计算机系老师的信息。视图定义代码:CREATE VIEW V_TCS AS SELECT tno,tn,sex,age,prof,sal,comm,T.dno FROM T,D WHERE T.dno=D.dno AND D.dn='计算机' 视图查询语句与查询结果截图:SELECT * FROM V_TCS2. 定义视图V_sal,存放全体教师的教师号,教师姓名,教师酬金(工资+岗位津贴),职称信息。视图定义代码:CREATE VIEW V_sal AS SELECT tno 教师号,tn 教师姓名,sal+comm 教师酬金,prof 支撑信息 FROM T视图查询语句与查询结果截图:SELECT * FROM V_sal3. 向V_TCS中插入一条计算机专业教师的新记录,并查询V_TCS视图的全部记录。视图更新代码:INSERT INTO V_TCS SELECT 'T10','良瑗','女',20,'讲师',6000,8000,D.dno FROM D WHERE D.dn='计算机'视图查询语句与查询结果截图:SELECT * FROM V_TCS4. 向V_TCS中插入一条信息专业教师的新记录,并查询V_TCS视图的全部记录。视图更新代码:INSERT INTO V_TCS SELECT 'T11','百里登风','男',21,'讲师',6000,8000,D.dno FROM D WHERE D.dn='信息'视图查询语句与查询结果截图:SELECT * FROM V_TCSSELECT * FROM T WHERE tno='T11'5. 修改V_TCS中的记录,使得编号为t2的教师的职称为副教授。视图更新代码:UPDATE V_TCS SET prof='副教授' WHERE tno='T2' 视图查询语句与查询结果截图:SELECT * FROM V_TCS WHERE tno='T2'6. 定义视图V_ TCS_ck(定义时加with check option),存放全部计算机系老师的信息,对比该视图与V_TCS在进行数据更新时的差别。视图定义代码:CREATE VIEW V_TCS_ck AS SELECT tno,tn,sex,age,prof,sal,comm,T.dno FROM T,D WHERE T.dno=D.dno AND D.dn='计算机'WITH CHECK OPTION视图更新对比实验代码及运行结果截图:-1.能插入INSERT INTO V_TCS_ckSELECT 'T12','良莠','女',20,'讲师',4000,4000,D.dno FROM D WHERE D.dn='计算机'-2.不能插入(视图CHECK OPTION约束)INSERT INTO V_TCS_ckSELECT 'T13','天明','男',25,'讲师',4000,4000,D.dno FROM D WHERE D.dn='信息'7. 在课程C表的课程名属性上按降序创建唯一索引I_cn。索引定义代码:CREATE INDEX I_cn ON C(cn DESC)运行结果截图:8. 删除C表上的索引I_cn。索引删除代码:DROP INDEX C.I_cn运行结果截图:4 深入思考与讨论1) 请先自己定义一个视图,使定义该视图的查询中使用连接。再更新该视图,观察视图更新受限情况。-1.定义:CREATE VIEW V_SC AS SELECT sn,S.sno,cn,score FROM S,C,SC WHERE S.sno=SC.sno AND C.cno=SC.cno-2.查询:SELECT * FROM V_SC-3.均无法插入(插入影响到多张表):INSERT INTO V_SC VALUES('笑笑','S1','JAVA',99)INSERT INTO V_SC VALUES('笑笑','S1','RUBY',99)INSERT INTO V_SC VALUES('良垣','S15','JAVA',99)INSERT INTO V_SC VALUES('良莠','S1','JAVA',99) SELECT * FROM V_SC WHERE sno='S1'-4.可以更新(修改分数只影响到SC一张表):UPDATE V_SC SET V_SC.score=99 WHERE V_SC.cn='大学英语' AND V_SC.sno='S1'SELECT * FROM V_SC WHERE sno='S1'-5.无法更新年龄(视图V_SC不包含age列):UPDATE V_SC SET age=18 WHERE V_SC.sno='S1'-6.无法更新,修改会影响到S和SC两张表:UPDATE V_SC SET sn='韩笑',score=98 WHERE V_SC.sno='S1' -7.将成绩为NULL的课程名设为NULL,更新失败(遵守基表C的cn列的NOT NULL约束):UPDATE V_SC SET cn=NULL WHERE score IS NULL2) 请先自己定义一个视图,使定义该视图的查询带分组和集函数。再更新该视图,观察视图更新受限情况。-1.定义:CREATE VIEW V_SC_gp AS SELECT sn,S.sno,AVG(score) avg_scoreFROM S,C,SC WHERE S.sno=SC.sno AND C.cno=SC.cnoGROUP BY sn,S.sno-2.查询:SELECT * FROM V_SC_gp-3.无法插入:INSERT INTO V_SC_gp VALUES('刘静','S8',88)-4.无法更新(avg_score集函数列):UPDATE V_SC_gp SET avg_score=88 WHERE sn='小明'-5.无法更新(视图包含聚集函数、GROUP BY子句):UPDATE V_SC_gp SET sn='小小云' WHERE sn='小明'