【2019-2020春学期】数据库作业14:第五章: 数据库完整性 习题 + 存储过程

在这里插入图片描述在这里插入图片描述

6、
STAFF(Snum,Sname,Sage,Duty,Salary,Dnum)
DEPARTMENT(Dnum,Dname,Mname,Tnum)

	CREATE TABLE DEPARTMENT     /* 部门,因为职工中要引用部门的部门号作为外键,所以要先创建部门的表 */
	(Dnum NUMERIC(6),     /* 部门号 */
	Dname CHAR(10),     /* 名称 */
	Mname CHAR(10),     /* 经理名 */
	Tnum CHAR(12),     /* 电话 */
	CONSTRAINT DepartmentKey PRIMARY KEY(Dnum)     /* 将部门号设为主码 */
	);
	CREATE TABLE STAFF     /* 职工 */
	(Snum NUMERIC(6)PRIMARY KEY,     /* 职工号,设为主码 */
	Sname CHAR(10),     /* 姓名 */
	Sage INT,     /* 年龄 */
	CONSTRAINT Sage1 CHECK(Sage<=60),     /* 职工年龄不得超过60岁 */
	Duty CHAR(10),     /* 职务 */
	Salary INT,     /* 工资 */
	Dnum NUMERIC(6),     /* 所在部门号 */
	CONSTRAINT FK_DEPTON FOREIGN KEY(Dnum)     /* Dnum为外键,引用DEPARTMENT表中的Dnum */
		REFERENCES DEPARTMENT(Dnum)     
	);

2、
建立成绩表

	CREATE TABLE COURSE  /*成绩表*/
	(snum NUMERIC(6),    /* 学号 */
	sname CHAR(10),    /* 姓名 */
	Grade INT,     /* 成绩 */
	CONSTRAINT Grade CHECK(Grade>=0 AND Grade<=100),    /* 限制成绩在0-100 */
	Cname CHAR(10)   /* 科目 */
	);

在这里插入图片描述
(1)统计离散数学的成绩发布情况,即按照各分数段统计人数

建立一个离散数学按各分段统计人数的表

	CREATE TABLE COURSR_LS
	(Grade  CHAR(10),  /* 分数段 */ 	
	 Count INT,       /* 人数*/
     Cname CHAR(10)  /* 科目*/	
	);

在这里插入图片描述
存储过程

	IF (exists (select * from sys.objects where name = 'LS_counts'))
	DROP PROCEDURE LS_counts
	GO
	CREATE  PROCEDURE LS_counts
	AS
	BEGIN TRANSACTION TRANS  
	DECLARE 
	    @60 INT,    /* <60  */
	    @70 INT,    /*  >=60 AND <70 */
	    @80 INT,    /*  >=70 AND <80 */
	    @90 INT,	  /*  >=80 AND <90 */
	    @100 INT   /*  >=90 AND <=100 */
	SELECT @60=COUNT(*) FROM COURSE
						WHERE  Cname='离散数学' AND Grade<60

	SELECT @70=COUNT(*) FROM COURSE
						WHERE  Cname='离散数学' AND Grade<70 AND Grade>=60

	SELECT @80=COUNT(*) FROM COURSE
						WHERE  Cname='离散数学' AND Grade<80 AND Grade>=70

	SELECT @90=COUNT(*) FROM COURSE
						WHERE  Cname='离散数学' AND Grade<90 AND Grade>=80

	SELECT @100=COUNT(*) FROM COURSE
						WHERE  Cname='离散数学' AND Grade<=100 AND Grade>=90
	
	BEGIN 
	UPDATE COURSR_LS SET Count=@60 WHERE Grade='0-59'
	UPDATE COURSR_LS SET Count=@70 WHERE Grade='60-69'
	UPDATE COURSR_LS SET Count=@80 WHERE Grade='70-79'
	UPDATE COURSR_LS SET Count=@90 WHERE Grade='80-89'
	UPDATE COURSR_LS SET Count=@100 WHERE Grade='90-100'
	COMMIT TRANSACTION TRANS; 
	END

在这里插入图片描述

执行存储过程

	EXEC LS_counts
	SELECT *
	FROM COURSR_LS

在这里插入图片描述

(2)统计任意一门课的平均成绩

新建一个平均成绩的表

	CREATE TABLE AVG
	(
		Cname CHAR(10),   /* 科目*/	
		avg INT
	);

在这里插入图片描述

建立存储过程

	IF (exists (select * from sys.objects where name = 'COURSE_AVG'))
	DROP PROCEDURE COURSE_AVG
	GO
	CREATE  PROCEDURE COURSE_AVG
	AS
	BEGIN TRANSACTION TRANS  
	DECLARE 
	    @LS_C INT,    /* 离散总分 */
	    @GS_C INT,    /* 高数总分 */
	    @XD_C INT,    /* 线代总分 */
		@DX_C INT,    /* 电子线路总分 */
		@SJK_C INT   /* 数据库总分 */
	SELECT @LS_C=AVG(Grade) FROM COURSE
						WHERE  Cname='离散数学' 

	SELECT @GS_C=AVG(Grade) FROM COURSE
						WHERE  Cname='高等数学'

	SELECT @XD_C=AVG(Grade) FROM COURSE
						WHERE  Cname='线性代数'

	SELECT @DX_C=AVG(Grade) FROM COURSE
						WHERE  Cname='电子线路'

	SELECT @SJK_C=AVG(Grade) FROM COURSE
						WHERE  Cname='数据库'
	
	BEGIN 
	UPDATE AVG SET avg=@LS_C WHERE Cname='离散数学'
	UPDATE AVG SET avg=@GS_C WHERE Cname='高等数学'
	UPDATE AVG SET avg=@XD_C WHERE Cname='线性代数'
	UPDATE AVG SET avg=@DX_C WHERE Cname='电子线路'
	UPDATE AVG SET avg=@SJK_C WHERE Cname='数据库'
	COMMIT TRANSACTION TRANS; 
	END

在这里插入图片描述
执行存储过程

	EXEC COURSE_AVG
	SELECT *
	FROM AVG

在这里插入图片描述

(3)将学生选课成绩由百分制改为等级制

原表:
在这里插入图片描述

	ALTER TABLE COURSE ADD  Grade_Level CHAR;
	IF (exists (select * from sys.objects where name = 'Up'))
	DROP PROCEDURE Up
	GO
	CREATE  PROCEDURE Up
	AS
	BEGIN TRANSACTION TRANS  		
	BEGIN
	UPDATE COURSE SET Grade_Level='A' WHERE Grade>=90 AND Grade<=100
	UPDATE COURSE SET Grade_Level='B' WHERE Grade>=80 AND Grade<90
	UPDATE COURSE SET Grade_Level='C' WHERE Grade>=70 AND Grade<80
	UPDATE COURSE SET Grade_Level='D' WHERE Grade>=60 AND Grade<70
	UPDATE COURSE SET Grade_Level='E' WHERE Grade<60
	COMMIT TRANSACTION TRANS; 
	END

这里 ALTER TABLE COURSE ADD Grade_Level CHAR; 在存储过程中容易反复调用,建议如上放置存储过程外

在这里插入图片描述

执行存储过程

	EXEC Up
	SELECT *
	FROM COURSE

在这里插入图片描述

终于写完了,从下午2点到现在8点,除去吃饭的半个小时,写了将近5个半小时。仅仅一个第2题的(1)我就写了三个多小时,我也不知道是什么情况,可能是我记得还不牢,不能灵活运用。这些题都是我一个一个打在软件上,解决报错确认无误后写上来的。过了(1)后面两小题,我明显快了非常多,遇到问题也能很快的解决。我觉得做这个作业收获挺多的,我是更喜欢实践的,写作业,让我实际运用更加自如。第2题的第(1)小题,我有参考老师同学,因为不知道为什么不对,找出了自己的问题。后面就是自己写了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值