实验三 索引和视图
一、 实验目的
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,并要求进行修改和插入操作时仍需保证该视图只有数学系的学生,视图的属性名为Sno,Sname,Sage,Sdept。
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='数学';