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