1.实验目的
- 通过课堂理论学习与实验课的实际操作,充分理解视图的相关概念,作用,以及特点,视图中定义的是对一个或多个基本表的查询语句,其本身并不保存数据,所有的数据都存储在数据库的表中,因此视图又称为虚拟表;
- 熟练掌握基本的SQL Server的视图的基本操作,包括创建视图、修改视图、删除视图、视图的数据查询、视图的管理和维护、通过视图更改基本表等,强化学生对视图的实际应用能力;
- 重点掌握创建视图与通过视图修改基本表中的数据,在此实验的基础上,正确理解视图与基本表之间的关系,同时通过实验进一步加深主键、外键、参照性关系等知识点的掌握程度。
2.实验内容
- 创建视图: 交互式创建视图View_S、交互式创建视图View_SCORE、T-SQL创建视图View_COURESE;
- 修改视图: 交互式删除视图字段、T-SQL增加视图字段;
- 通过视图修改数据库数据: 交互式通过视图修改基本表数据、视图执行INSERT语句,查看基本表变化、修改视图定义再执行INSERT语句,查看基本表变化、T-SQL对视图执行DELETE语句,查看基本表变化;
- 删除视图: 交互式删除视图、T-SQL删除视图;
3.实验步骤
3.1创建视图
1.交互式创建视图View_S
(1)展开数据库【jiaoxuedb】,右击【视图】选择【新建视图】,在弹出的参数表中选中我们希望创建视图的数据库表【STUDENT】,选中数据库表中的所有列:
(2)正确选择数据库表与数据库表的列后,在设计器下方会显示预显示的视图内容与创建视图的T-SQL语句的代码,可以参考用作学习,点击保存后输入视图名称:
2.交互式创建视图View_SSCORE
创建视图View_SSCORE,我们需要的数据库表有STUDENT、COURESE、SC中的Sname、Cname、Score的信息,因此需要我们在创建视图时导入三个数据库表/视图,并选中相应的数据列,点击保存后,输入视图名称即可完成创建视图;
多表联合创建视图的原理与多表连接基本相同,在创建过程中主键对其的影响十分之大,如果主键连接不够合理与正确,得到视图将会出现重复数据等等错误。
结果如下:
3.T-SQL创建视图View_COURESE
新建查询,输入代码如下所示,其代码含义为选中数据库jiaoxuedb,以数据库表【TEACHER】【COURESE】【TC】中的列【TNAME】【CNAME】,创建一个命名为VIEW_CTABLE的视图:
得到结果如下:
3.2修改视图
1.交互式删除视图字段
选中视图,右击选择【设计】,打开视图编辑器,删除特定字段可以在上半部分直接取消勾选,如果基本表与列过多,也可以在下半部分选中列右击后删除,删除操作因为过于直接且无法撤回,一般都是交互式方法要优于T-SQL语句方法:
2.T-SQL增加视图字段
新建查询,输入代码如下所示,虽然代码提示【VIEW_CTABLE】不存在,但代码可以执行,且结果正确:
得到结果如下所示:
3.3通过视图修改数据库数据
1.交互式通过视图修改基本表数据
交互式通过视图修改基本表数据,直接打开视图的【编辑前200行】,在视图中直接进行修改,保存后回到基本表之后即可发现基本表已经随着视图一起变化了:
2.视图执行INSERT语句,查看基本表变化
新建查询,输入代码如下,其代码语句与普通的插入语句相同,但因为视图是基本表的子集,仅插入TNAME,SEX,DEPT几个列属性,但执行过后却提示INSERT失败。
其根本原因在于如果希望通过更改视图更改基本表,输入的数据中又无Sno(学号即主键),INSERT语句是必然失败的,因为主键不允许为空值,而如果通过更改视图更改基本表,未输入数据的列会默认为空值,与主键的定义相矛盾,因此执行INSTER语句失败。
3.修改视图定义再执行INSERT语句,查看基本表变化
结合上述实验与分析,如果仍想要执行INSERT语句,需要修改视图定义使其含有主键,才可执行INSERT语句:
打开视图的设计器,在基本表中勾选主键【Sno】,保存后刷新即可在视图中看见主键已被添加至视图中;
新建查询,输入代码如下,与上述实验的代码相比主要是添加了主键的值;
此时返回视图与基本表可以看到INSERT语句插入的新行已经在数据库表中了,说明在重新定义视图后INSERT语句执行成功,且未输入值的属性都被赋值为空。
4.T-SQL对视图执行DELETE语句,查看基本表变化
新建查询,输入代码如下所示,其代码含义为在视图VIEW_S中删除Sno为S9的行,可以看到除视图以外,基本表也发生了改变,这也侧面说明了删除操作的简单粗暴性。
3.4删除视图
1.交互式删除视图
交互式删除视图,选择对应的数据库,打开【视图】,选择对应的视图后右键,找到【删除】选项即可删除:
2.T-SQL删除视图
新建查询,输入代码如下所示,其代码含义为删除名为View_CTABLE的视图:
4.课后习题
1.创建成绩视图SCORE_VIEW,包含:学号SNO、姓名SN、课程名CN、成绩Score
利用交互式方法,新建视图添加数据库表【STUDENT】【SCORE】【COURESE】,选择其中的Sno、Sname、Score、Cname;
得到结果如下:
2.创建一个计算机系学生名单视图S_VIEW,包含:学号SNO、姓名SN、性别SEX:
新建查询,利用T-SQL语句输入代码如下,其代码含义为选中数据库jiaoxuedb其中的表【STUDENT】,创建一个命名为S_VIEW的视图,将表【STUDENT】中DEPT的值为【计算机】的行的SNO、SN、SEX的值添加至视图中:
得到结果如下,符合我们的数据库表中的数据:
3.通过上面的视图SCORE_VIEW,修改学号为S4,课号为C2的成绩记录:
因为视图SCORE_VIEW中没有课号的列属性,首先我们需要为视图添加新的列,利用交互式修改视图属性的方法,得到结果如下:
新建查询,输入代码如下所示,查看结果后符合预期:
4.为视图S_VIEW增加一个年龄AGE字段:
利用交互式方法修改视图属性较为简单便捷,因此选择视图S_VIEW,右击设计,打开视图设计器勾选AGE,再次打开视图即可看见年龄AGE字段已被添加:
5.实验总结
5.1相关概念的区分
- 主键与索引的关系:简单来说:++主键是一种特殊的索引,主键是索引,索引不一定是主键++,索引可以是多列,主键只能是一列。因此创建主键后,系统会自动为我们生成聚簇索引;
- 主键与唯一索引的区别:主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。主键创建后一定会包含一个唯一性索引。除此之外,++唯一性索引列允许空值,而主键列不允许为空值++;
- 聚簇索引与非聚簇索引的区别:二者首先并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引直接指向存储的数据,而非聚簇索引(辅助索引)则直接指向聚簇索引的key值,这表示非聚簇索引访问数据需要二次查找,而聚簇索引访问则不需要。
5.2实验中的常见问题
- 创建索引时显示:无法对表创建多个聚簇索引:
此问题出现的根本原因为一个表只能存在一个聚集索引,创建主键会自动生成聚集索引,因此我们无法对已有主键的数据库表创建聚簇索引;
如果依然想要创建聚簇索引,我们需要首先删除对应数据库表的主键。
5.3实验心得
- 此次的实验内容相比第二次实验无论是理解还是操作难度都轻松不少,其原因在于无论是索引还是视图,作为数据库中较为常用的工具,实验的重点在于理解其概念、作用以及特点,就具体操作来说都是创建、修改删除等等我们之前进行反复练习的基础操作,因此本次实验过程中也未遇见过多实际操作问题;
- 随着学习的不断深入,我们可以明显感觉到实验对T-SQL语句的准确性的要求也在不断提高。在此次实验中,我就已经出现了++虽然代码不显示报错,但是最终结果不符合预期++的情况,例如:数据库表出现异常重复数据、T-SQL语句执行后使表中已有数据变为空值等等,常见原因多为表与表之间的连接错误。