數據庫作業14:第五章: 數據庫完整性 課後作業 + 存儲過程

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

在這裏插入圖片描述

總結:第二道題有參考別人的答案,對存儲過程的理解稍微加深了一點,但是在自己寫的過程中還是出現了一些問題,但是後來經過對比基本解決了。

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