数据库完整性 习题 + 存储过程

数据库完整性 习题 + 存储过程_第1张图片
数据库完整性 习题 + 存储过程_第2张图片
数据库完整性 习题 + 存储过程_第3张图片
为了期末考,纸上写的是标准SQL:
数据库完整性 习题 + 存储过程_第4张图片
数据库完整性 习题 + 存储过程_第5张图片
这里没有看全题,不知道第三问要转换为等级,起变量名也不知道起什么,就只想到了最简单的A,B,C,D,E,于是变量名就很巧合的符合了第三问。。

T-SQL:
为了在SQL Server上实验,就直接在这里打代码了。

CREATE TABLE MathCount
(Level CHAR(10) PRIMARY KEY,
Countnum INT
);

INSERT INTO MathCount VALUES('90~100',0);
INSERT INTO MathCount VALUES('80~90',0);
INSERT INTO MathCount VALUES('70~80',0);
INSERT INTO MathCount VALUES('60~70',0);
INSERT INTO MathCount VALUES('<60',0);

IF(EXISTS(SELECT * FROM sys.objects WHERE NAME = 'SMath_Grade'))
  DROP PROCEDURE SMath_Grade;
GO
--以上语句,为删除同名的存储过程,刚开始,我以为没有同名的不需要删除,但是删除后,后面的CREATE会受影响,会有错误,说是CREATE语句为批处理语句。。什么什么的,于是后来又加上了。
CREATE PROCEDURE SMath_Grade
--和上述标准SQL一样,该存储过程没有参数
AS
BEGIN
DECLARE
 @levelA INT,
 @levelB INT,
 @levelC INT,
 @levelD INT,
 @levelE INT;

SELECT @levelA = count(*) --标准SQL这里用的INTO
FROM SC,Course
WHERE SC.Cno = Course.Cno AND Cname = '离散数学'
      AND (Grade >= 90 AND Grade <= 100);
SELECT @levelB = count(*) --标准SQL这里用的INTO
FROM SC,Course
WHERE SC.Cno = Course.Cno AND Cname = '离散数学'
      AND (Grade >= 80 AND Grade < 90);
SELECT @levelC = count(*) --标准SQL这里用的INTO
FROM SC,Course
WHERE SC.Cno = Course.Cno AND Cname = '离散数学'
      AND (Grade >= 70 AND Grade < 80);
SELECT @levelD = count(*) --标准SQL这里用的INTO
FROM SC,Course
WHERE SC.Cno = Course.Cno AND Cname = '离散数学'
      AND (Grade >= 60 AND Grade < 70);
SELECT @levelE = count(*) --标准SQL这里用的INTO
FROM SC,Course
WHERE SC.Cno = Course.Cno AND Cname = '离散数学'
      AND (Grade >= 0 AND Grade <  60);

UPDATE MathCount SET Countnum = @levelA WHERE Level = '90~100';
UPDATE MathCount SET Countnum = @levelB WHERE Level = '80~90';
UPDATE MathCount SET Countnum = @levelC WHERE Level = '70~80';
UPDATE MathCount SET Countnum = @levelD WHERE Level = '60~70';
UPDATE MathCount SET Countnum = @levelE WHERE Level = '<60';
--如果前面没有事先在表中插入数据,这里可以将更新改为插入
END;

EXEC SMath_Grade; --没有参数,后面不需要跟变量

SELECT * FROM MathCount;
SELECT * FROM SC;

数据库完整性 习题 + 存储过程_第6张图片
这里写成绩范围的时候,第一次用的BETWEEN…AND…,但是这样会有重叠在边界处,会出现错误,所以应该用比较运算符,上面的标准SQL那里我懒得改了。。。
数据库完整性 习题 + 存储过程_第7张图片
(2)
数据库完整性 习题 + 存储过程_第8张图片
课程号给的空间有些大了
T-SQL:

CREATE TABLE Avg_Grade
(Cno CHAR(2),
Avggrade FLOAT
);

IF(EXISTS(SELECT * FROM sys.objects WHERE name = 'Pro_Avg_grade'))
  DROP PROCEDURE Pro_Avg_grade;
GO
CREATE PROCEDURE Pro_Avg_grade(@Cno CHAR(2))
--带参数,用于指定哪一门课程
AS
BEGIN
DECLARE
  @Agrade FLOAT;
SELECT Agrade = AVG(Grade) FROM SC
WHERE SC.Cno = @Cno;

INSERT INTO Avg_Grade VALUES(@Cno,@Agrade);
END;

EXEC Pro_Avg_grade
     @Cno = 5;

EXEC Pro_Avg_grade
     @Cno = 2;

SELECT * FROM Avg_Grade;

在这里插入图片描述
(3)
数据库完整性 习题 + 存储过程_第9张图片
因为该存储过程,既没有变量也没有参数,所以T-SQL与标准SQL没有太大的差别,就运行时不同

数据库完整性 习题 + 存储过程_第10张图片
刚开始写的时候,把存储过程的名字都加了‘’,于是就一直报错。。

【心得】
在上次作业写存储过程这一块就有些吃力,例题少,也没有特别深的印象,这次写完,感觉清楚了很多,但一上来做题简直摸不到头脑,参考了同学的,才了解了些,后面写起来也比较容易。就是记不住创建存储过程的套路,总是需要往前翻一翻整理的笔记。

你可能感兴趣的:(数据库完整性 习题 + 存储过程)