数据库作业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

在这里插入图片描述

总结:第二道题有参考别人的答案,对存储过程的理解稍微加深了一点,但是在自己写的过程中还是出现了一些问题,但是后来经过对比基本解决了。

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