本文是《数据库系统概论》的第五章(数据库完整性)的部分课后习题和存储过程习题,题目来源:【2019-2020春学期】数据库作业14:第五章: 数据库完整性 习题 + 存储过程
数据库完整性习题6
假设有下面两个关系模式:
职工(职工号,姓名,年龄,职务,工资,部门号),其中职工号为主码:
部门(部门号,名称,经理名,电话),其中部门号为主码。
用SQL语言定义这两个关系模式,要求在模式中完成以下完整性约束条件的定义:
①定义每个模式的主码;②定义参照完整性;③定义职工年龄不得超过60岁。
(ps:因为之前我就建立过COMPANY数据库,里面含有这两张表,不过关系模式不一样,所以我先将原有的两张表删除)
-- 切换至COMPANY数据库,并删除原来的两张表
USE COMPANY;
DROP TABLE Staff; /*这里需要注意要先删除Staff表,因为它引用了Dept表的主码作为外码约束,必须先把它删了才删得了Dept表*/
DROP TABLE Dept;
-- 按该题要求新建Dept和Staff表,分别对应部门和职工两个关系模式
CREATE TABLE Dept (
DNO VARCHAR(10) PRIMARY KEY,
DNAME VARCHAR(10) UNIQUE, /*给部门名设置UNIQUE,隐含着NOT NULL*/
MNAME VARCHAR(10) NOT NULL, /*经理名*/
PHONE INT NOT NULL
)
CREATE TABLE Staff (
SNO VARCHAR(10) PRIMARY KEY,
SNAME VARCHAR(10) NOT NULL,
AGE INT CHECK(AGE <= 60 AND AGE > 0) NOT NULL,
DUTY VARCHAR(8) NOT NULL, /*职务*/
SALARY INT NOT NULL,
DNO VARCHAR(10) REFERENCES Dept(DNO)
)
因为职工表Staff 里的部门号DNO引用的是部门表Dept的主码DNO,所以得先建立Dept表再建立Staff表~
如下图,新建成功!
👏值得注意的是:给部门名DNAME设置的UNIQUE键其实某种意义上隐含着不能为空,因为如果出现多个空值的话,他们就是相同的,即违反了UNIQUE键,如下图:
存储过程习题2
对学生-课程数据库编写存储过程,完成下述功能:
1)统计离散数学的成绩分布情况,即按照各分数段统计人数:
(ps:学生-课程数据库涉及Student、Course、SC三张表,之前在写操作基础篇的时候用到很多次啦,因为目前课程表Course中没有离散数学这个科目,所以我先添加课程:离散数学且同时给SC表添加相应数据)
-- 添加课程:离散数学
INSERT
INTO Course
VALUES ('8', '离散数学', NULL, 4);
SELECT * FROM Course;
(ps:Cpno是先修课的课程号,即学了先修课才能学该课程,我这里就不设置先修课啦,Ccredit是该课程的学分)
--