实验四 SQL Serve的数据更新、视图操作
一、实验目的:
1. 掌握采用Transact-SQL实现数据更新。
2. 掌握采用Transact-SQL实现视图的定义、删除、查询与更新。
二、实验内容
按照学生课程数据库studb和SPJ数据库完成以下操作:
(一)数据更新
1) 插入一个学生:张红,女,200215135,信息系,20岁;
2) 插入一个选课录:200215135,1,成绩未定;
3) 将计算机系所有学生的年龄加1岁;
4) 添加一条选课记录,信息为:张红选修了数据库课程,成绩89;
5) 删除所有200215130学生的选课记录;
6) 删除所有姓张的同学的信息;
7) 请自行设计案例对学生-课程数据库的数据更新,并观察是否有违反数据的完整性约束。
(二)视图
1)创建一个学生成绩统计视图,包括学号,姓名,选课门数,平均分,最高分,最低分;
2)利用上题所建视图实现:
①查询成绩高于自己平均成绩的选课记录;
②查询每个同学获得最高分的选课记录;
3)请为三建工程项目建立一个供应情况的视图,包括供应商(SNAME)、零件(PNAME)、供应数量(QTY)。针对该视图完成下列查询:
①找出三建工程项目使用的各种零件及其数量;
②找出供应商东方红的供应情况;
③将东方红供应的螺丝刀数量增加100。
三、实验要求
1.写出正确的Transact-SQL命令。
2.无须记录正确的查询结果。但要求记录实验过程中发生的有学习意义的错误及错误信息。
3.写好实验小结
create database Studata
ON(
NAME=Studat,
FILENAME='D:\project\Studat.mdf',
SIZE=5mb,
FILEGROWTH=2MB
),
(
NAME='Stulog',
FILENAME='D:\project\Stulog.ldf',
SIZE=5MB,
MAXSIZE=10MB,
FILEGROWTH=10MB
)
GO
use Studata;
create table s(
class char(5),
Sno char(2),
name char(10)unique,
Sex char(2),
Age INT,
PRIMARY KEY(class,Sno),
)
insert into s(class,Sno,name,Sex,Age)
values('95031','25','李明','男',21)
insert into s(class,Sno,name,Sex,Age)
values('95101','10','王丽','女',20)
insert into s(class,Sno,name)
values('95031','30','郑和')
alter table s
alter column Age SMALLINT;
alter table s
ADD comedate datetime ;
alter table s
Drop CONSTRAINT PK__s__7C8480AE;
create clustered INDEX inxage
ON s(age desc)
drop index s.inxage;
drop table s;
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('201215121','李勇','男',20,'CS')
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
Values('201215122','刘晨','女',19,'CS')
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
Values('201215123','王敏','女',18,'MA')
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
Values('201215125','张立','男',19,'IS')
/* Course表*/
insert into Course(Cno,Cname,Ccredit)
Values('6','数据处理',2)
insert into Course(Cno,Cname,Ccredit)
Values('2','数学',2)
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('4','操作系统','6',3)
insert into Course(Cno,Cname,Cpno,Ccredit)
Values('1','数据库','5',4)
insert into Course(Cno,Cname,Cpno,Ccredit)
Values('3','信息系统','1',4)
/*SC表*/
insert into SC(Sno,Cno,Grade)
Values('201215121','1',92)
insert into SC(Sno,Cno,Grade)
Values('201215121','2',85)
insert into SC(Sno,Cno,Grade)
Values('201215121','3',88)
insert into SC(Sno,Cno,Grade)
Values('201215122','2',90)
insert into SC(Sno,Cno,Grade)
Values('201215122','3',80)
select * from Student
select * from SC
select * from Course
/*(1)插入一个学生:张红,女,200215135,信息系,20岁;*/
insert into Student(Sno,Sname,Ssex,Sage,Sdept)Values('200215135','张红','女',20,'IS')
/*(2)插入一个选课录:200215135,1,成绩未定;*/
insert into SC(Sno,Cno,Grade)Values('200215135','1',null)
/*(3)将计算机系所有学生的年龄加1岁;*/
update student set Sage=Sage+1 where Sdept='CS'
/*(4)添加一条选课记录,信息为:张红选修了数据库课程,成绩89;*/
update sc set grade=89 where sno in (select sno from student where sname ='张红')
/*(5)删除所有200215130学生的选课记录;*/
delete from Sc where sno = '200215130'
/*(6)删除所有姓张的同学的信息;*/
delete from sc where sno in(select sno from student where sname like '张%')
delete from student where sname like '张%'
/*(7)请自行设计案例对学生-课程数据库的数据更新,并观察是否有违反数据的完整性约束。*/
/*创建一个学生成绩统计视图,包括学号,姓名,选课门数,平均分,最高分,最低分;*/
create view 学生成绩统计(学号,姓名,选课门数,平均分,最高分,最低分)
AS select sc.sno,sname,count(cno),avg(grade),max(grade),min(grade) from student,sc
where student.sno = sc.sno group by sc.sno,student.sname
/*利用上题所建视图实现:*/
/*①查询成绩高于自己平均成绩的选课记录;*/
select Sc.Sno,Cno,Grade from Sc,学生成绩统计 where Sc.Sno = 学生成绩统计.学号 and Grade>平均分
/*②查询每个同学获得最高分的选课记录;*/
select Sc.Sno,Cno,Grade from Sc,学生成绩统计 where Sc.Sno = 学生成绩统计.学号 and Grade=最高分;