视图和索引(数据库实验4).docx
数据库基础与实践实验报告实验四 视图和索引精选文档1 实验目的: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 ASSELECT tno,tn,sex,age,prof,sal,comm,T.dno FROM T,DWHERE T.dno=D.dno AND D.dn='计算机'视图查询语句与查询结果截图:SELECT * FROM V_TCS2. 定义视图V_sal,存放全体教师的教师号,教师姓名,教师酬金(工资+岗位津贴),职称信息。视图定义代码:CREATE VIEW V_sal AS10SELECT tno 教师号,tn 教师姓名,sal+comm 教师酬金,prof 支撑信息FROM T视图查询语句与查询结果截图:SELECT * FROM V_sal3. 向 V_TCS 中插入一条计算机专业教师的新记录,并查询V_TCS 视图的全部记录。视图更新代码:INSERT INTO V_TCSSELECT 'T10','良瑗','女',20,'讲师',6000,8000,D.dno FROM DWHERE D.dn='计算机'视图查询语句与查询结果截图:SELECT * FROM V_TCS4. 向 V_TCS 中插入一条信息专业教师的新记录,并查询V_TCS 视图的全部记录。视图更新代码:INSERT INTO V_TCSSELECT 'T11','百里登风','男',21,'讲师',6000,8000,D.dno FROM DWHERE 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,DWHERE T.dno=D.dno AND D.dn='计算机'WITH CHECK OPTION视图更新对比实验代码及运行结果截图:-1.能插入INSERT INTO V_TCS_ckSELECT 'T12','良莠','女',20,'讲师',4000,4000,D.dno FROM DWHERE D.dn='计算机'-2.不能插入(视图CHECK OPTION约束) INSERT INTO V_TCS_ckSELECT 'T13','天明','男',25,'讲师',4000,4000,D.dno FROM DWHERE 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 ASSELECT sn,S.sno,cn,score FROM S,C,SCWHERE 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 ASSELECT sn,S.sno,AVG(score) avg_score FROM S,C,SCWHERE S.sno=SC.sno AND C.cno=SC.cno GROUP 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='小明'