本篇文章记录了第十四次作业
使用的数据库是SQL Server,使用的数据库管理软件是SQL Server Management Studio.
当然这里是写题目用的全部都是标准SQL。
职工(职工号,姓名,年龄,职务,工资,部门号),其中职工号为主码;
部门(部门号,名称,经理名,电话),其中部门号为主码。
用SQL语言定义这两个关系模式,要求在模式中完成以下完整性约束条件的定义:
这个在写建表的时候就能够一口气都写完达成这些要求。
--首先是职工的表
CREATE TABLE EMP
(Eno NUMBER(4) PRIMARY KEY,
Ename CHAR(10),
Age NUMBER(4),
CONSTRAINT C1 CHECK (Age<=60),
Job CHAR(10),
Sal NUMBER(8,2),
Dno NUMBER(2),
FOREIGN KEY(Dno) REFERENCES DEPT(Dno)
);
--部门表
CREATE TABLE DEPT
(Dno NUMBER(2) PRIMARY KEY,
Dname CHAR(10),
Manager CHAR(10),
Tel CHAR(12)
);
这题跟刚刚那个简直不是一个等级的。
那么我们怎么写?首先得建立一个表,让它能够存取我们的统计人数,然后再写一个存储过程。
--建表
CREATE TABLE MBCOUNT /*MB是离散数学*/
(GRADE CHAR(20),
NUM SMALLINT
);
INSERT INTO MBCOUNT VALUES('[0,60)',0)
INSERT INTO MBCOUNT VALUES('[60,70)',0)
INSERT INTO MBCOUNT VALUES('[70,80)',0)
INSERT INTO MBCOUNT VALUES('[80,90)',0)
INSERT INTO MBCOUNT VALUES('[90,100]',0)
SELECT * FROM MBCOUNT;
--建立存储过程
CREATE OR REPLACE PROCEDURE MB_S()
AS DECLARE
S060 SMALLINT;
S6070 SMALLINT;
S7080 SMALLINT;
S8090 SMALLINT;
S90100 SMALLINT;
BEGIN
SELECT S060=COUNT(*)
FROM SC
WHERE Grade<60 AND Cname=MB;
UPDATE MBCOUNT SET Num=S060 WHERE GRADE='[0,60)'
SELECT S6070=COUNT(*)
FROM SC
WHERE Grade>=60 AND Grede<70 AND Cname=MB;
UPDATE MBCOUNT SET Num=S060 WHERE GRADE='[60,70)'
SELECT S7080=COUNT(*)
FROM SC
WHERE Grade>=70 AND Grade<80 AND Cname=MB;
UPDATE MBCOUNT SET Num=S060 WHERE GRADE='[70,80)'
SELECT S8090=COUNT(*)
FROM SC
WHERE Grade>=80 AND Grade<90 AND Cname=MB;
UPDATE MBCOUNT SET Num=S060 WHERE GRADE='[80,90)'
SELECT S90100=COUNT(*)
FROM SC
WHERE Grade<=100 AND Grade>=90 AND Cname=MB;
UPDATE MBCOUNT SET Num=S060 WHERE GRADE='[90,100]'
COMMIT;
END;
CALL PROCEDURE MB_S();
SELECT * FROM MBCOUNT;
统计任何一门课的平均成绩也可以统计所有课的平均成绩,然后按需求拿出来就好了。同上文思路类似。
--建表
CREATE TABLE SCAVG /*MB是离散数学*/
(Cno CHAR(4),
Cname CHAR(20),
AvgScore FLOAT
);
INSERT INTO SCAVG VALUES('1','课程1',0);
INSERT INTO SCAVG VALUES('2','课程2',0);
INSERT INTO SCAVG VALUES('3','课程3',0);
SELECT * FROM SCAVG;
--建立存储过程
CREATE OR REPLACE PROCEDURE AVGSCORE()
AS DECLARE
AVG1 FLOAT;
AVG2 FLOAT;
AVG3 FLOAT;
SELECT AVG1=AVG(Grade)
FROM SC
WHERE Cno='1'
UPDATE SCAVG SET AvgScore=AVG WHERE Cno='1';
SELECT AVG2=AVG(Grade)
FROM SC
WHERE Cno='2'
UPDATE SCAVG SET AvgScore=AVG WHERE Cno='2';
SELECT AVG3=AVG(Grade)
FROM SC
WHERE Cno='3'
UPDATE SCAVG SET AvgScore=AVG WHERE Cno='3';
COMMIT;
END;
--执行
CALL PROCEDURE AVGSCORE();
SELECT * FROM SCAVG;
与第一问的分段程序类似。
--增加等级制
ALTER TABLE SC ADD GRADE CHAR(1);
--建立存储过程
CREATE OR REPLACE PROCEDURE CGRADE()
BEGIN
UPDATE SC SET GRADE='E' WHERE Grade<60;
UPDATE SC SET GRADE='D' WHERE Grade>=60 AND Grade<70;
UPDATE SC SET GRADE='C' WHERE Grade>=70 AND Grade<80;
UPDATE SC SET GRADE='B' WHERE Grade>=80 AND Grade<90;
UPDATE SC SET GRADE='A' WHERE Grade>=90 AND Grade<100;
COMMIT;
END;
CALL PROCEDURE CGRADE();
SELECT* FROM SC;
这一个大题我不能保证没有错误,要说像上面那个简单题就算了,但这个是我第一次写存储过程,很可能有BUG。
参考文献:
[1]萨师煊,王珊,数据库系统概论.5版.北京:高等教育出版社,2014.
[2] 咸鱼4号的博客