构建学生信息表student、课程信息表course、学生选课信息表sc,并插入相关信息。
CREATE TABLE student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
CREATE TABLE course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES course(Cno)
);
CREATE TABLE sc
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES student(Sno),
FOREIGN KEY (Cno) REFERENCES course(Cno)
);
一、向student表插入以下数据
insert into student(sno, sname, ssex, sage, sdept) values('200215121', '李勇', '男', 20, 'CS');
insert into student(sno, sname, ssex, sage, sdept) values('200215122', '刘晨', '女', 19, 'IS');
insert into student(sno, sname, ssex, sage, sdept) values('200215123', '王敏', '女', 18, 'MA');
insert into student(sno, sname, ssex, sage, sdept) values('200215124', '张立', '男', 19, 'IS');
insert into student(sno, sname, ssex, sage, sdept) values('200215125', '刘云', '女', 18, 'CS');
insert into student(sno, sname, ssex, sage, sdept) values('200215126', '王楠', '女', 19, 'CS');
insert into student(sno, sname, ssex, sage, sdept) values('200215127', '王小志', '男', 17, 'IS');
insert into student(sno, sname, ssex, sage, sdept) values('200215128', '王皇明', '男', 16, 'IS');
二、向course表插入以下数据
说明:
因为course表的cpno是外键,它是参照course表中的主键cno进行取值,故插入数据时可以按照数据依赖的关系进行数据的插入。本题可以按照cno=2,6,4,7,5,1,3,8的顺序执行下列的插入命令。
SQL语句:
insert into course(cno, cname, cpno, ccredit) values('2', '数学', null, 6 );
insert into course(cno, cname, cpno, ccredit) values('6', '数据处理', null, 3 );
insert into course(cno, cname, cpno, ccredit) values('4', '操作系统', '6', 4 );
insert into course(cno, cname, cpno, ccredit) values('7', 'PASCAL语言', '6', 4 );
insert into course(cno, cname, cpno, ccredit) values('5', '数据结构', '7', 4 );
insert into course(cno, cname, cpno, ccredit) values('1', '数据库', '5', 4);
insert into course(cno, cname, cpno, ccredit) values('3', '信息系统', '1', 3 );
insert into course(cno, cname, cpno, ccredit) values('8', '数据库原理', '5', 4 );
三、向sc表插入以下数据
insert into sc(sno, cno, grade) values('200215121', '1', 92);
insert into sc(sno, cno, grade) values('200215121', '2', 85);
insert into sc(sno, cno, grade) values('200215121', '3', 88);
insert into sc(sno, cno, grade) values('200215122', '2', 90);
insert into sc(sno, cno, grade) values('200215122', '3', 80);
insert into sc(sno, cno, grade) values('200215123', '2', 85);
insert into sc(sno, cno, grade) values('200215124', '1', 58);
insert into sc(sno, cno, grade) values('200215124', '2', 85);
insert into sc(sno, cno, grade) values('200215128', '2', 89);
insert into sc(sno, cno, grade) values('200215128', '3', 77);
insert into sc(sno, cno, grade) values('200215128', '1', 56);
insert into sc(sno, cno, grade) values('200215127', '2', 100);
insert into sc(sno, cno, grade) values('200215127', '3', 97);
insert into sc(sno, cno, grade) values('200215127', '1', 93);
SQL语句:
go
create view IS_Student(sno,sname,sage,sdept)
as
select sno,sname,sage,sdept
from student
where sdept='IS';
go
select * from IS_Student; //查看该视图的内容
说明:
create view语句为为批处理中仅有的语句,故其前后都需要添加go。
SQL语句:
go
create view IS_S1(学号,课程号,分数)
as
select student.sno 学号,cno 课程号,grade 分数
from student,sc
where sdept='IS' and
student.sno=sc.sno and
sc.cno='1';
go
select * from IS_S1;
SQL语句:
go
create view IS_S2
as
select 学号,课程号,分数
from IS_S1
where 分数>=90;
go
select * from IS_S2;
SQL语句:
go
create view F_student
as
select *
from student
where ssex='女';
go
select * from F_student;
SQL语句:
go
create view S_G(sno,gavy)
as
select sno,AVG(grade)
from sc
group by sno;
go
select * from S_G;
注:函数AVG()会自动求平均值。
利用函数创建一个“视图”myAgeFunView,要求能够显示年龄在某个指定年龄段内的学生的信息。年龄段由2个参数来定义。然后利用该创建好的“视图”,查询年龄在[17, 19]年龄段内的学生信息。
SQL语句:
go
create function myAgeFunView(@a float,@b float) returns table
as
return
(select *
from student
where sage>=@a and sage<=@b
);
go
select * from myAgeFunView(17,19); //查询年龄在[17, 19]年龄段内的学生信息
视图修改的基本语法:
alter view [视图名]
as
新的select 语句
SQL语句:
go
alter view F_student
as
select *
from student
where ssex='女' and sdept='CS';
go
select * from F_student;
说明: 引入视图结构修改的目的是为避免与视图相关的数据库对象的变换,如触发器,关联等。
SQL语句:
select * from IS_Student where sage<20;
SQL语句:
select IS_Student.sno,sname
from IS_Student,sc
where IS_Student.sno=sc.sno and sc.cno='1';
注意查看基表student中的学号为 ‘200215122’的学生姓名是否因为视图的数据更新操作而影响被改为‘侯亮平’?
SQL语句:
update IS_Student
set sname='侯亮平'
where sno='200215122';
select * from IS_Student;
select * from student;
结果显示,基表student中的学号为 ‘200215122’的学生姓名也因为视图的数据更新操作而影响被改为‘侯亮平’。
SQL语句:
insert into IS_Student values('200215129','沙瑞金',54,'IS');
select * from IS_Student;
SQL语句:
insert into IS_Student values('200215139','易学习',48,'CS');
select * from IS_Student;
select * from student;
说明:
插入失败。视图IS_Student中并无该记录,因为视图IS_Student在定义之初已选定sdept的值为IS。由于插入新的学生记录时,其sdept的值为CS,重新查看视图IS_Student时,该记录已被排除。故查看视图IS_Student后并无该记录。而查看视图IS_Student的基表student时,会有该记录。该记录的sdept值为CS。
SQL语句:
insert into S_G values('201211339',88);
说明:
结果显示“插入失败,因其包含派生域或常量域”。平均成绩是由student表中对元祖分组后计算平均值所得的结果,视图定义中含有group by子句,故该视图不允许更新。
注意:
(1)视图由两个以上基本表导出,则该视图不允许更新
(2)视图的字段来自字段表达式或常数,则不允许对此视图执行insert和update操作,但允许执行delete操作
(3)视图的字段来自聚集函数,则此视图不允许更新
(4)视图定义中含有group by子句,则该视图不允许更新
(5)视图定义中含有distinct短语,则该视图不允许更新
(6)视图定义中有嵌套查询,且内层查询的from子句中涉及的表也是导出该视图的基本表,则该视图不允许更新
(7)一个不允许更新的视图上定义的视图亦不允许更新
SQL语句:
drop table sc;
delete
from IS_Student
where sno='201215129';
select * from student;
结果显示,该视图的基表student中仍然包含该记录。
SQL语句:
drop view S_G;
当我们用CREATE VIEW语句创建视图时,有关该视图的信息将存储在系统的目录视图sys.views中,可以试着使用如下SQL命令查看当前数据库中的所有用户定义的视图。
select name ‘视图名称(当前数据库)’ from sys.views;
SQL语句:
select name 'db_xxx' from sys.views;
SQL语句:
exec sp_helptext F_student;
1、数据库系统概论(第5版).王珊 萨师煊 著
2、老师给的实验报告模板