有一個數據庫,數據庫中包括以下表:數據庫
(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