有一个数据库,数据库中包括以下表:数据库
(a) “学生”表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sbirth)、所在系(Sdept)五个属性组成,记为:Student(Sno,Sname,Ssex,Sage,Sdept) ,Sno 为关键字。
(b) “课程”表Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、
学分(Ccredit)四个属性组成,可记为: Course(Cno,Cname,Cpno,Ccredit)
Cno为关键字。
(c) “学生选课”表SC由学号(Sno)、课程号(Cno)、工号(Tno)、学期(semester)、成绩(Grade)三个属性组成, (Sno,Cno,Tno,semester) 为关键字。
(d)教师表工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tbirth)、所在系(Tdept)
(e)教师授课表:工号(Tno)、课程号(Cno),开课时间(time)
完成下列操做:
1) 建立教师表、课程表和教师授课表
use gaoyue
------建立教师表------
create table Teacher
(
[Tno][varchar](12)NOT NULL,
[Tname][char](20)NOT NULL,
[Tsex][char](2) NULL,
[Tbirth][smalldatetime] NULL,
[Tdept][varchar](12) NULL,
constraint pk_Tno primary key (Tno)
)
------建立课程表------
create table Course
(
[Cno][varchar](6)NOT NULL,
[Cname][varchar](20)NOT NULL,
[Cpno][varchar](6)NOT NULL,
[Ccredit][int] NULL,
constraint pk_Cno primary key (Cno)
)
------建立教师授课表------
create table GS
(
[Tno][varchar](12)NOT NULL,
[Cno][varchar](6)NOT NULL,
[time][smalldatetime] NULL,
)
2) 建立学生选课表,包括主外键
------建立学生选课表------
CREATE TABLE SC
(
[Sno][varchar](12)NOT NULL,
[Tno][varchar](12)NOT NULL,
[Cno][varchar](6)NOT NULL,
[semeter][varchar](6)NOT NULL,
[Grade][int] NULL,
FOREIGN KEY(Sno)
REFERENCES student(Sno),
FOREIGN KEY(Cno)
REFERENCES Course(Cno))
3) 创建约束:学生表中学生年龄介于15至30之间
-------建立创建约束:学生表中学生年龄介于15至30之间-----
alter table student
add constraint CK_age check (datediff("year",Sbirth,getdate()) between 15and 30 )
4) 向学生表插入一条记录20050204,'张三','男', '国贸系'。
------向学生表插入一条记录,'张三','男', '国贸系'------
INSERT INTO [gaoyue].[dbo].[student]
([Sno] ,[Sname],[Ssex] ,[Sbirth],[Sdept])
VALUES
( 20120204 ,'张三' ,'男' , null ,'国贸系')
5) 建立存储过程统计指定课程的平均成绩,并将统计的结果用输出参数返回。
-------建立存储过程统计指定课程的平均成绩,并将统计的结果用输出参数返回-----
create procedure AvgGrade @cn char(20), @avg_grade int output as select @avg_grade = AVG(Grade) from SC join Course C ON C.Cno = SC.Cno where Cname =@cn
6) 创建一个UPDATE触发器,该触发器防止修改选课表中SC的成绩。
-------创建一个UPDATE触发器,该触发器防止修改选课表中SC的成绩-----
create trigger trigger_SC
on SC
instead of update
AS
BEGIN
rollback transaction
END
7) 在“课程表”的“课程号”列上建立惟一汇集索引。
------ 在“课程表”的“课程号”列上建立惟一汇集索引------
Create UNIQUE CLUSTERED INDEX IX_Cno on Course(Cno)
8) 建立视图“view_1”,该视图包括计算机系学生的信息。
----------建立试图view 该视图包括计算机学生的信息-----------
create view view_1
as select * from Student where Sdept = '计算机';
9) 查询比信息系的学生年龄都小的其余系的学生年龄和姓名。
------查询比信息系的学生年龄都小的其余系的学生年龄和姓名-------
select sname,
cast ((year (getdate())-year (Sbirth)) as int) as 年龄
from student
where Sbirth >(select max (Sbirth) from student
where sdept='信息系')
10) 将学生表中学号为“20050202”的学生所在院系改成“计算机系”。
---------- 将学生表中学号为“”的学生所在院系改成“计算机系”。-----------
update Student set Sno = '20050202' where Sdept = '计算机系'
11) 删除 “学生表”中的全部记录。
---------- 11) 删除删除“学生表”中的全部记录-----------
delete from student
12) 查询全部任课教师讲授的课程,没有教授课程的教师对应的课程为空。
---------- 查询全部任课教师讲授的课程,没有教授课程的教师对应的课程为空。-----------
select t.Tno,t.Tname,s.Cname from Teacher t Left join (select tc.Tno as Tno,c.Cname as Cname from GS tc Left join Course c on tc.Cno = c.Cno) s on t.Tno = s.Tno
select Teacher.Tno, Teacher.Tname, Teacher.Cname from Teacher t Left join (select GS.Tno as Tno, Course.Cname as Cname from GS Left join Course on GS.Cno = Course.Cno) SC on Teacher.Tno = SC.Tno
13) 按授课教师分组查询“高等数学”课程的最低分、最高分和平均分。
---------- 按授课教师分组查询“高等数学”课程的最低分、最高分和平均分-----------
select Teacher.Tname ,min(SC.grade)as 最低分, max(SC.grade)as 最高分,avg(SC.grade) as 平均分from Teacher ,SC ,GS,Course
where Teacher.Tno=GS.Tno and Teacher.Tno=GS.Tno and Course.Cno= SC.Cno and Course.cname ='高等数学' group by Teacher.Tname
14) 设计触发器实现以下约束:没有选修“数据结构”课的学生不能选修“程序设计”。
15) 建立以下函数:输入教师工号Tno,课程号Cno,输出选修了教师Tno所授课程Cno的学生信息,包括姓名,性别,学号,所在院系。
CREATE FUNCTION TC(@Tno varchar(12),@Cno varchar(6))
RETURNS @S TABLE
( Sno varchar (12) ,
Sname nchar(20),
Ssex nchar(2),
Sdept varchar (12)
)
AS
BEGIN
INSERT @S
SELECT student.Sno, student.Sname, student.Ssex, student.Sdept
FROM student
INNER JOIN SC ON (student.Sno =SC. Sno)
WHERE SC.Tno=@Tno
and SC.Cno=@Cno
RETURN
END