【數據庫】作業14——第五章: 數據庫完整性 習題 + 存儲過程


 

 

作業原地址:作業

 

目錄

6.

2.

(1)

(2)

(3)

總結

 


 


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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章