作業原地址:作業
目錄
6.
假設有下面兩個關係模式:
職工(職工號,姓名,年齡,職務,工資,部門號),其中職工號爲主碼;
部門(部門號,名稱,經理名,電話),其中部門號爲主碼。
用 SQL 語言定義這兩個關係模式,要求在模式中完成以下完整性約束條件的定義:
(1)定義每個模式的主碼;(2)定義參照完整性;(3)定義職工年齡不得超過60歲。
Staff(Sno,Sname,Sage,Spost,Wage,Dno)
Dept(Dno,Dname,Mname,Dtel)
CREATE TABLE Dept
(Dno CHAR(9) PRIMARY KEY,
Dname CHAR(20),
Mname CHAR(20),
Tel CHAR(20)
);
CREATE TABLE Staff
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20),
Ssex CHAR(2),
Sage SMALLINT,
CONSTRAINT C1 CHECK(Sage<=60),
Post CHAR(20),
Pay CHAR(20),
Dno CHAR(9),
FOREIGN KEY (Dno) REFERENCES Dept(Dno)
);
2.
對學生-課程數據庫編寫存儲過程, 完成下述功能:
添加數據:
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES ('5','離散數學',3,4);
INSERT INTO SC(Sno,Cno,Grade) VALUES ('201215121','5',20);
INSERT INTO SC(Sno,Cno,Grade) VALUES ('201215122','5',60);
INSERT INTO SC(Sno,Cno,Grade) VALUES ('201215123','5',70);
INSERT INTO SC(Sno,Cno,Grade) VALUES ('201215124','5',80);
INSERT INTO SC(Sno,Cno,Grade) VALUES ('201215125','5',90);
成績表:
CREATE TABLE SCC
(Score CHAR(10), /*成績分段*/
Num SMALLINT /*學生人數*/
);
INSERT INTO SCC(Score,Num) VALUES('[0,60)',0); /*0——60*/
INSERT INTO SCC(Score,Num) VALUES('[60,70)',0); /*60——70*/
INSERT INTO SCC(Score,Num) VALUES('[70,80)',0); /*70——80*/
INSERT INTO SCC(Score,Num) VALUES('[80,90)',0); /*80——90*/
INSERT INTO SCC(Score,Num) VALUES('[90,100]',0); /*90——100*/
SELECT * FROM SCC
(1)
統計離散數學的成績分佈情況,即按照各分數段統計人數。
IF (exists (select * from sys.objects where name = 'Stats'))
DROP PROCEDURE count0
GO
CREATE PROCEDURE count0 /*定義存儲過程*/
AS
DECLARE /*定義變量*/
@0to60 INT, /*成績小於60的人數*/
@60to70 INT, /*成績大於60小於70的人數*/
@70to80 INT, /*成績大於70小於80的人數*/
@80to90 INT, /*成績大於80小於90的人數*/
@90to100 INT, /*成績大於90小於100的人數*/
@CNO CHAR(8);
SELECT @CNO=Cno
FROM SC
WHERE Cname='離散數學';
SELECT @0to60=COUNT(*)
FROM SC
WHERE Grade<60 AND Cno=@CNO
SELECT @60to70=COUNT(*)
FROM SC
WHERE Grade<70 AND Grade>=60 AND Cno=@CNO
SELECT @70to80=COUNT(*)
FROM SC
WHERE Grade<80 AND Grade>=70 AND Cno=@CNO
SELECT @80to90=COUNT(*)
FROM SC
WHERE Grade<90 AND Grade>=80 AND Cno=@CNO
SELECT @90to100=COUNT(*)
FROM SC
WHERE Grade>=90 AND Cno=@CNO
UPDATE SCC
SET Num=@90to100
WHERE Grades='>90'
UPDATE SCC
SET Num=@80to90
WHERE Grades='>80'
UPDATE SCC
SET Num=@70to80
WHERE Grades='>70'
UPDATE SCC
SET Num= @60to70
WHERE Grades='>60'
UPDATE SCC
SET Num=@0to60
WHERE Grades='<60'
(2)
統計任意一門課的平均成績
IF (exists (select * from sys.objects where name = 'Avg'))
DROP PROCEDURE Avg
GO
CREATE PROCEDURE Avg
AS
SELECT DECLARE
SELECT DISTINCT Cname,avg(Grade) AS Avg
FROM SC,Course
WHERE SC.Cno=Course.Cno AND SC.Cno=@cno
GROUP BY Cname;
(3)
將學生選課成績從百分制改爲等級制(即A、B、C、D、E)。
IF (exists (select * from sys.objects where name = 'Lv'))
DROP PROCEDURE Lv
GO
CREATE PROCEDURE Lv
AS
UPDATE SC SET Le='A' WHERE Grade>=100;
UPDATE SC SET Le='B' WHERE Grade<9 AND Grade>=80;
UPDATE SC SET Le='C' WHERE Grade<80 AND Grade>=70;
UPDATE SC SET Le='D' WHERE Grade<70 AND Grade>=60;
UPDATE SC SET Le='E' WHERE Grade<60;
SELECT *
FROM Course,SC
WHERE SC.Cno=Course.Cno;
EXEC Lv
總結
難......第二個真的難,自己真的沒做出來,最後到處找資料,參考着來都沒有自己寫出來。還得琢磨啊。
完成時間:1h42min
以上
————(2020.4.5)