数据库实验三 索引与视图

本文是一篇关于数据库实验的介绍,重点在于掌握如何使用SSMS和T-SQL创建、删除索引以及创建、查询、更新和删除视图。实验内容包括建立学生选课数据库,为学生表、课程表、学生选修表创建不同类型的索引,以及创建各种视图并进行相关操作,如更新视图中的平均年龄等。

                                                              实验三  索引和视图

 

一、 实验目的

1. 掌握利用SSMS和T—SQL语句创建和删除索引的两种方法。

2. 掌握利用SSMS和T—SQL语句创建、查询、更新及删除视图的方法。

二、 实验要求

1. 能认真独立完成实验内容;

2. 实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;

3. 验后做好实验总结,根据实验情况完成实验报告。情况完成总结报告。

三、 实验学时

  2学时

四、 实验内容

1、用T—SQL建立一个“学生选课数据库”,在此基础上用SQL语句建立该数据库包含的学生表,课程表,学生选修表:

学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 其中Sno为主键且Sname不能为空值,且取值唯一、Ssex只能取值男或女、Sage 在15到30之间:


Sno

Sname

Ssex

Sage

Sdept

S01

S02

S03

S04

S05

S06

王建平

刘华

范林军

李伟

黄河

长江

21

19

18

19

18

20

自动化

自动化

计算机

数学

数学

数学

 

课程表:Course(Cno,Cname,Cpno,Credeit) 其中Cno为主键

Cno

Cname

Cpno

Credit

C01

英语

NULL

4

C02

数据结构

C05

2

C03

数据库

C02

2

C04

DB_设计

C03

3

C05

C++

NULL

3

C06

网络原理

C07

3

C07

操作系统

C05

3

学生选修表:SC(Sno,Cno,Grade) 其中Sno,Cno为主键同时又为外键、Grade值在0到100;

Sno

Cno

Grade

S01

C01

92

S01

C03

84

S02

C01

90

S02

C02

94

S02

C03

82

S03

C01

72

S03

C02

90

S04

C03

75

 

2.索引的建立、删除

①用SSMS的方式为Student表按Sno(学号)升序建唯一索引

②用T—SQL语句为Course表按Cno(课程号)升序建唯一索引,

③用T—SQL语句为SC表按Sno(学号)升序和Cno(课程号)号降序建唯一索引。

④能否用T—SQL语句再为表Students的Sname(姓名)Sno(学号)列上建立一个聚簇索引?若不能说明原因?

⑤用T—SQL语句删除基本表SC上的唯一索引。

 

3.用T—SQL完成如下视图的建立、查询、修改及删除

1)建立数学系学生的视图C_Student,并要求进行修改和插入操作时仍需保证该视图只有数学系的学生,视图的属性名为SnoSnameSageSdept

2) SSMS的方式建立学生的学号(Sno)、姓名(Sname)、选修课程名(Cname)及成绩(Grade)的视图Student_CR。

 

3) 定义一个反映学生出生年份的视图Student_birth(Sno, Sname, Sbirth)

4)建立先修课程为空的课程视图v_course

5) 建立成绩高于90分的女生成绩视图v_F_grade(包括学号,姓名,课程号及成绩列)

6)建立视图S_AVGAGE(其中包括性别SSEX与平均年龄AVG_AGE两列)用以反映男生、女

生的平均年龄

7)对前面创建的视图S_AVGAGE执行更新操作:

UPDATE S_AVGAGE

SET AVG_AGE = 85

WHERE  ssex = '女'

 

上述语句能否成功执行?为什么?

8) 在数学系的学生视图C_Student中找出年龄(Sage)小于20岁的学生姓名(Sname)和年龄

(Sage)。

9) Student_CR视图中查询成绩在85分以上的学生学号(Sno)、姓名(Sname)和课程名称

(Cname)。

10) 将数学系学生视图C_Student中学号为S05的学生姓名改为“黄海”。

11) 向数学系学生视图C_Student中插入一个新的学生记录,其中学号为“S09”,姓名为“王海”,年龄为20岁。

12) 删除数学系学生视图C_Student中学号为“S09”的记录。

 

 执行代码

CREATE DATABASE 学生选课数据库
ON PRIMARY
(NAME=学生选课数据库_data,
FILENAME='D:\包春春\实验三\学生选课数据库_data.mdf',
SIZE=10,
MAXSIZE=100,
FILEGROWTH=10)
LOG ON
(NAME=学生选课数据库_log,
FILENAME='D:\包春春\实验三\学生选课数据库_log.ldf',
SIZE=20,
MAXSIZE=200,
FILEGROWTH=10)


CREATE TABLE Student 
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL UNIQUE,
Ssex CHAR(2)CHECK(Ssex IN('男','女')),
Sage INT  CHECK(Sage>15 AND Sage<30),
Sdept CHAR(20)); 


CREATE TABLE Course
(Cno CHAR (5) PRIMARY KEY,
Cname CHAR(30),
Cpno CHAR(5),
Credeit INT);  


CREATE TABLE SC 
(Sno CHAR(9),
Cno CHAR(5),
Grade INT CHECK(Grade>0 AND Grade<100) 
PRIMARY KEY (Sno,Cno), 
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno));


INSERT
INTO Student
VALUES('S01','王建平','男','21','自动化'),
('S02','刘华','女','19','自动化'),
('S03','范林军','女','18','计算机'),
('S04','李伟','男','19','数学'),
('S05','黄河','男','18','数学'),
('S06','长江','男','20','数学');


INSERT
INTO Course
VALUES('C01','英语','NULL','4'),
('C02','数据结构','C05','2'),
('C03','数据库','C02','2'),
('C04','DB_设计','C03','3'),
('C05','C++','NULL','3'),
('C06','网络原理','C07','3'),
('C07','操作系统','C05','3');


 INSERT
INTO SC 
VALUES('S01','C01','92'),
('S01','C03','84'),
('S02','C01','90'),
('S02','C02','94'),
('S02','C03','82'),
('S03','C01','72'),
('S03','C02','90'),
('S04','C03','75');




CREATE UNIQUE INDEX Stusno ON Student(Sno);


CREATE UNIQUE INDEX Coucno ON Course(Cno);


CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);


CREATE CLUSTERED INDEX  Snamesno ON Student(Sname,Sno)


DROP INDEX SC.SCno;


CREATE VIEW C_Student(Sno,Sname,Sage,Sdept)
AS 
SELECT Sno,Sname,Sage,Sdept
FROM Student 
WHERE Sdept='数学'
WITH CHECK OPTION;




CREATE VIEW Student_birth(Sno, Sname, Sbirth)
AS 
SELECT Sno, Sname,2014-Sage
FROM Student;




CREATE VIEW v_course
AS
SELECT *
FROM Course
WHERE Cpno=NULL;


CREATE VIEW v_F_grade(Sno,Sname,Cno,Grade) 
AS
SELECT Student.Sno,Sname,SC.Cno,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno AND Ssex='女' AND Grade>90


CREATE VIEW S_AVGAGE(Ssex,AVG_AGE)
AS
SELECT Ssex,AVG(Sage)
FROM Student
GROUP BY Ssex;
 
 
CREATE VIEW Student_CR(Sno,Sname,Cname,Grade) 
AS
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno;




 UPDATE S_AVGAGE
 SET AVG_AGE=85
 WHERE Ssex='女';
 
 
 SELECT Sage,Sname
 FROM C_Student
 WHERE Sage<20;
 
 SELECT Sno,Sname,Cname
 FROM Student_CR
 WHERE Grade >85;
 
 UPDATE C_Student
 SET  Sname='黄海'
 WHERE  Sdept='数学' AND Sno='S05';
 
 
  INSERT 
  INTO C_Student(Sno,Sname,Sage,Sdept)
  VALUES('S09','王海','20','数学')
  
  DELETE
  FROM  Student
  WHERE Sno='S09' AND Sdept='数学';
  
   
 



 

提供的引用内容中未涉及数据库原理应用实验关于索引视图的相关内容,无法根据引用准确回答该问题。不过,一般数据库原理应用实验中关于索引视图实验指导及相关内容通常如下: ### 实验目的 理解索引视图的概念、作用和工作原理,掌握在数据库中创建、使用和管理索引视图的操作。 ### 实验环境 常见的数据库管理系统,如 MySQLSQL Server 等。 ### 实验准备 - 安装好相应的数据库管理系统并启动服务。 - 准备一个测试数据库及相关数据表,例如创建一个包含学生信息的`students`表,包含`id`、`name`、`age`、`gender`等字段。 ```sql -- 创建 students 表 CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50), age INT, gender VARCHAR(10) ); ``` ### 实验内容及操作示例 #### 索引部分 - **创建索引** - **创建普通索引**:为`students`表的`name`字段创建普通索引。 ```sql CREATE INDEX idx_name ON students (name); ``` - **创建唯一索引**:确保`students`表的`id`字段值唯一。 ```sql CREATE UNIQUE INDEX idx_unique_id ON students (id); ``` - **查看索引** 查看`students`表的所有索引。 ```sql SHOW INDEX FROM students; ``` - **删除索引** 删除`students`表的`idx_name`索引。 ```sql DROP INDEX idx_name ON students; ``` #### 视图部分 - **创建视图** 创建一个视图`v_students`,只显示`students`表的`id`和`name`字段。 ```sql CREATE VIEW v_students AS SELECT id, name FROM students; ``` - **查询视图** 查询`v_students`视图。 ```sql SELECT * FROM v_students; ``` - **修改视图** 修改`v_students`视图,使其还显示`age`字段。 ```sql CREATE OR REPLACE VIEW v_students AS SELECT id, name, age FROM students; ``` - **删除视图** 删除`v_students`视图。 ```sql DROP VIEW v_students; ``` ### 注意事项 - 索引虽然可以提高查询速度,但会增加数据插入、更新和删除的开销,因此要合理创建索引- 创建视图时要确保视图的查询语句语法正确,避免因基础表结构变化导致视图无法正常使用。 - 在进行删除索引视图操作时要谨慎,确认操作的必要性,避免误删影响数据库的正常使用。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值