### 数据库实验报告知识点解析 #### 一、实验题目与目的 本次实验主要涉及两个方面的内容:**索引的建立和删除操作**以及**视图的创建、修改、更新和查询操作**。实验目的是让学生掌握数据库索引的基本操作及其意义,并深入理解视图的创建与使用方法。 1. **索引的建立与删除** - **知识点**: - 索引的作用:加快数据检索速度,提高查询效率。 - 索引的分类:主要包括**唯一性索引**、**非聚簇索引**和**聚簇索引**。 - **唯一性索引**:确保索引列的值唯一,可以是升序或降序。 - **非聚簇索引**:索引项并不按物理顺序存储,而是指向实际数据的位置。 - **聚簇索引**:表的数据行按索引键值的顺序存储,通常会影响表的插入、删除和更新操作的性能。 - **意义**:合理使用索引可以显著提升数据库系统的性能,但过多或不合理的索引会增加磁盘空间的占用和维护成本。 2. **视图的创建与使用** - **知识点**: - 视图的定义:视图是一种虚拟表,其内容由查询定义。 - 视图的作用:简化复杂的查询操作,提供数据的安全访问,以及隐藏数据库的复杂性。 - 视图的创建原则: - 只能在当前数据库中创建视图。 - 视图名不得与该用户的表名相同。 - 可以在视图上建立其他视图。 - 定义视图时不能包含ORDER BY等关键字。 - 不能创建临时视图。 #### 二、实验内容详解 1. **索引的建立和删除操作** - **建立索引** - 在表`S`中创建按照`sno`升序的唯一性索引`snoIDX`。 ```sql CREATE UNIQUE INDEX snoIDX ON S(Sno ASC); ``` - 在表`SC`中创建按照学号升序和课程号降序的唯一性索引`scIDX`。 ```sql CREATE INDEX scIDX ON SC(Sno ASC, Cno DESC); ``` - 在表`S`中按照生日建立一个非聚簇索引`birthdayIDX`。 ```sql CREATE NONCLUSTERED INDEX birthdayIDX ON S(Sbirthday ASC); ``` - 在表`C`中建立一个按照课程名升序的聚簇索引`cnameIDX`。 ```sql CREATE CLUSTERED INDEX cnameIDX ON C(Cno ASC); ``` - **删除索引** - 删除表`C`中的索引`cnameIDX`。 ```sql DROP INDEX C.cnameIDX; ``` 2. **视图的创建、修改、更新和查询操作** - **创建视图** - 创建一个关于所有女生信息的视图`S_GIRL`。 ```sql CREATE VIEW S_GIRL AS SELECT * FROM S WHERE Ssex = '女'; ``` - 将各系学生人数和平均年龄定义为视图`V_NUM_AVG`。 ```sql CREATE VIEW V_NUM_AVG AS SELECT Sdept, COUNT(*) AS Num, AVG(Sage) AS AvgAge FROM S GROUP BY Sdept; ``` - 建立一个视图反映学生所选课程的总学分情况`TOTAL_CREDIT`。 ```sql CREATE VIEW TOTAL_CREDIT AS SELECT Sno, SUM(Ccredit) AS TotalCredit FROM SC JOIN C ON SC.Cno = C.Cno GROUP BY Sno; ``` - 建立一个所有学生课程成绩的视图`S_GRADE`。 ```sql CREATE VIEW S_GRADE AS SELECT S.*, C.Cname, SC.Grade FROM S JOIN SC ON S.Sno = SC.Sno JOIN C ON SC.Cno = C.Cno; ``` - 在视图`S_GRADE`基础上,建立一个两门课以上成绩不及格的学生情况视图`FAIL_GRADE`。 ```sql CREATE VIEW FAIL_GRADE AS SELECT Sno FROM S_GRADE WHERE Grade < 60 GROUP BY Sno HAVING COUNT(*) > 2; ``` - 建立一个至少选修了4门课及4门课以上的学生信息的视图`SC_FOUR`。 ```sql CREATE VIEW SC_FOUR AS SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >= 4; ``` - **修改视图** - 修改视图`S_GIRL`,只显示1997年以前出生的女生信息。 ```sql CREATE OR REPLACE VIEW S_GIRL AS SELECT * FROM S WHERE Ssex = '女' AND Sbirthday < '1997-01-01'; ``` - **更新视图** - 通过视图`S_GIRL`,将“王丹”的名字修改为“汪丹”。 ```sql UPDATE S_GIRL SET Sname = '汪丹' WHERE Sname = '王丹'; ``` - 通过视图`S_GIRL`,新增一个学生信息。 ```sql INSERT INTO S_GIRL (Sname, Ssex, Sdept, Sbirthday) VALUES ('刘兰兰', '女', '计算机学院', '1996-08-08'); ``` - 通过视图`S_GIRL`,删除1995年出生的女生信息。 ```sql DELETE FROM S_GIRL WHERE Sbirthday LIKE '1995%'; ``` - 通过视图`S_GRADE`,尝试将“汪丹”的名字修改为“王丹”。由于`S_GRADE`包含了多个表的连接,因此直接更新可能失败。 ```sql -- 不可行的原因:视图包含多表连接,直接更新可能导致失败。 -- UPDATE S_GRADE SET Sname = '王丹' WHERE Sname = '汪丹'; ``` - **删除视图** - 删除视图`S_GRADE`。 ```sql DROP VIEW S_GRADE; ``` #### 三、实验步骤与要求 - **实验步骤**:实验步骤部分已经给出了具体的SQL语句和运行结果的描述,这里不再赘述。 - **实验要求**: - 掌握索引的类型及其创建时的注意事项,例如每个表只能创建一个聚集索引,非聚集索引的数量限制等。 - 理解创建视图的目的和意义,掌握创建视图时需遵循的原则。 - 报告中需要明确写出具体的操作意图、操作命令(SQL语句)和执行结果。 - 对于重要的运行界面和结果窗口,需要用Alt+PrintScreen来截取当前窗口,并粘贴到实验报告中。 #### 四、总结 本实验通过实践的方式帮助学生深入理解数据库索引和视图的相关概念和技术细节,不仅提升了理论知识水平,还增强了实际操作能力。通过实验,学生能够更加熟练地应用SQL语句进行数据库的操作,这对于未来的学习和工作都是非常有益的。
- 粉丝: 1w+
- 资源: 5万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助