6、假設有下面兩個關係模式:
職工(職工號,姓名,年齡,職務,工資,部門號),其中職工號爲主碼;
部門(部門號,名稱,經理名,電話)。其中部門號爲主碼。
用SQL語言定義這兩個關係模式,要求在模式中完成以下完整型約束條件的定義:
(1)定義每個模式的主碼;
(2)定義參照完整性;
(3)定義職工年齡不得超過60歲。
CREATE TABLE DEPT
(Depno CHAR(4) PRIMARY KEY,
DEname CHAR(10),
Manager CHAR(10),
Tel CHAR(12)
)
CREATE TABLE Employee
(Eno CHAR(2) PRIMARY KEY,
Ename CHAR(10),
Eage CHAR(4)
CONSTRAINT C1 CHECK(Eage<=60),
Job CHAR(9),
Sal CHAR(10),
Depno CHAR (4),
FOREIGN KEY (Depno) REFERENCES DEPT(Depno))
注意:要先建立部門表,職工表會用到部門表的信息。
第八章
2、對學生-課程數據庫編寫存儲過程,完成下列功能:
(1)統計離散數學的成績分佈情況,即按照個分數段統計人數。
SC表:
1、建立新表,初始情況下
CREATE TABLE SC_MATH
(Grade CHAR(9),/*分數段*/
Count INT);/*人數*/
INSERT INTO SC_MATH VALUES('[0,60)',0);
INSERT INTO SC_MATH VALUES('[60,70)',0);
INSERT INTO SC_MATH VALUES('[70,80)',0);
INSERT INTO SC_MATH VALUES('[80,90)',0);
INSERT INTO SC_MATH VALUES('[90,100]',0);
2、建立存儲過程
IF (exists (select * from sys.objects where name = 'Proc_TRANSFER'))
DROP PROCEDURE Proc_TRANSFER
GO
CREATE PROCEDURE Proc_TRANSFER
/*定義存儲過程TRANSFER,*/
AS
DECLARE /*定義變量*/
@0_60 INT,
@60_70 INT ,
@70_80 INT ,
@80_90 INT ,
@90_100 INT,
@CNO CHAR(8);
/*給變量賦值*/
SELECT @CNO=Cno FROM Course WHERE Cname='離散數學';
SELECT @0_60=COUNT(*) FROM SC WHERE Grade<60 AND Cno=@CNO;
SELECT @60_70=COUNT(*) FROM SC WHERE Grade>=60 AND Grade<70 AND Cno=@CNO;
SELECT @70_80=COUNT(*) FROM SC WHERE Grade>=70 AND Grade<80 AND Cno=@CNO;
SELECT @80_90=COUNT(*) FROM SC WHERE Grade>=80 AND Grade<90 AND Cno=@CNO;
SELECT @90_100=COUNT(*) FROM SC WHERE Grade>=90 AND Grade<=100 AND Cno=@CNO;
/* 修改各分數段的人數,更新表SC_MATH */
UPDATE SC_MATH SET Num=@0_60 WHERE Score='[0,60)';
UPDATE SC_MATH SET Num=@60_70 WHERE Score='[60,70)';
UPDATE SC_MATH SET Num=@70_80 WHERE Score='[80,80)';
UPDATE SC_MATH SET Num=@80_90 WHERE Score='[80,90)';
UPDATE SC_MATH SET Num=@90_100 WHERE Score='[90,100]';
3、執行存儲過程
EXEC Proc_TRANSFER
SELECT * FROM SC_MATH
(2)統計任意一門課的平均成績。
1、建立新表SC_AVG
CREATE TABLE SC_AVG
(CNO CHAR(4),
Cname CHAR(9),
SC_AVG SMALLINT);
INSERT INTO SC_AVG VALUES('1','數據庫',0);
INSERT INTO SC_AVG VALUES('2','數學',0);
INSERT INTO SC_AVG VALUES('3','信息系統',0);
INSERT INTO SC_AVG VALUES('8','離散數學',0);
SELECT *
FROM SC_AVG;
2、建立存儲過程
IF (exists (select * from sys.objects where name = 'Avgcore'))
DROP PROCEDURE Avgcore
GO
CREATE PROCEDURE Avgcore
AS
DECLARE
@S1 FLOAT,
@S2 FLOAT,
@S3 FLOAT,
@S8 FLOAT;
SELECT @S1=AVG(Grade)
FROM SC
GROUP BY Cno
HAVING Cno='1'
SELECT @S2=AVG(Grade)
FROM SC
GROUP BY Cno
HAVING Cno='2'
SELECT @S3=AVG(Grade)
FROM SC
GROUP BY Cno
HAVING Cno='3'
SELECT @S8=AVG(Grade)
FROM SC
GROUP BY Cno
HAVING Cno='8'
UPDATE AvgSC SET Score=@S1 WHERE Cno='1';
UPDATE AvgSC SET Score=@S2 WHERE Cno='2';
UPDATE AvgSC SET Score=@S3 WHERE Cno='3';
UPDATE AvgSC SET Score=@S8 WHERE Cno='8';
3、執行存儲過程
EXEC Avgcore
SELECT* FROM AvgSC
(3)將學生選課成績從百分制改爲等級制(即A,B,C,D,E)。
1、給SC表添加新屬性Lev
ALTER TABLE SC
ADD Lev CHAR(4);
SELECT *
FROM SC;
2、建立存儲過程
IF (exists (select * from sys.objects where name = 'SClev'))
DROP PROCEDURE SClev
GO
CREATE PROCEDURE SClev
AS
UPDATE SC SET Lev='A'WHERE Grade>=90 AND Grade <=100;
UPDATE SC SET Lev='B'WHERE Grade>=80 AND Grade<90;
UPDATE SC SET Lev='C' WHERE Grade>=70 AND Grade<80;
UPDATE SC SET Lev='D'WHERE Grade>=60 AND Grade<70;
UPDATE SC SET Lev='E'WHERE Grade<60;
3、執行
EXEC SClev
SELECT* FROM SC
總結:第二道題有參考別人的答案,對存儲過程的理解稍微加深了一點,但是在自己寫的過程中還是出現了一些問題,但是後來經過對比基本解決了。