实验问题描述:

在这里插入图片描述

图1 教学管理系统E-R图

某学院有若干专业,每个专业有若干学生;学院每年每学期都开设有若干门课程;每门课程有多个学生选修,每个学生每学期可以同时选

修多门课程,每个学生对于同一门课程可以多次选修,但每学期只能选修1次,课程选修成绩以综合成绩记录。请设计某学院简单的教学

管理系统的E-R模型,要求给出每个实体、联系的属性。根据以上语义,我们可得了上图1如示的教学管理系统E-R图(属性未画出)。

根据学院提供的学生选课及其他的部分数据,将上图1所示的E-R图中的部分实体和联系转换为关系,得到如下4个关系模式和相应的数据

字典描述。

A、关系模式

⑴ 专业设置:包括专业编号、国家专业编号、专业名称、专业英文名称、学制、培养层次、授予学位、院系编号、院系名称;

⑵ 学生情况:包括学号、姓名、性别、出生日期、民族、籍贯、政治面貌、校区、生源地、入学日期、年级、班级名称、专业编号;

⑶ 课程设置:包括学年、学期、课程编号、课程名称、学分、学时数、课程类别1、课程类别2、环节类别、考核方式;

⑷ 学生选课:包括学号、课程编号、学年、学期、综合成绩。

B、数据字典
表名中文名
Major专业设置
Student学生情况
Course课程设置
SelectCourse学生选课
专业设置:Major
字段名数据类型可空性主键外键默认值字段含义
majorNoCHAR(4)NOT NULLYesNo专业代码
GBMajorNoCHAR(6)NOT NULLNoNo国家专业编号
majorNameVARCHAR(60)NOT NULLNoNo专业名称
enMajorNameVARCHAR(100)NULLNoNo英文名称
lengthSchoolTINYINTNOT NULLNoNo4学制
eduLevelCHAR(6)NOT NULLNoNo本科培养层次
ddegreeCHAR(12)NOT NULLNoNo授予学位
departmentNoCHAR(2)NOT NULLNoNo院系代码
departmentVARCHAR(40)NOT NULLNoNo院系名称
约束条件:
  • 专业代码为4位数字字符且不能为0000
  • 国家专业编号为6位数字字符且不能为000000
  • 院系代码为2位数字字符且不能为00
学生情况:Student
字段名数据类型可空性主键外键默认值字段含义
snoCHAR(12)NOT NULLYesNo学生学号
snameCHAR(16)NOT NULLNoNo学生姓名
sexCHAR(2)NOT NULLNoNo性别
birthdayDATENOT NULLNoNo出生日期
nationalityCHAR(16)NULLNoNo汉族民族
nativeCHAR CHAR(24)NULLNoNo东莞市籍贯
politicalCHAR(12)NULLNoNo共青团员政治面貌
districtCHAR(12)NOT NULLNoNo松山湖校区院系代码
studentSourceVARCHAR(24)NULLNoNo生源地
enterYearDATENOT NULLNoNo入学日期
schoolYearCHAR(12) TINYINTNOT NULL NOT NULLNoNo年级
classCHAR(24)NOT NULLNoNo班级
majorNoCHAR(4)NOT NULLNoYes专业代码
约束条件:
  • 学生学号为12位数字字符,第1位为2,其它位为数字且最后2位不能是00
  • 性别只能是‘男’或‘女’;
  • 专业代码参照表Major。
课程设置:Course
字段名数据类型可空性主键外键默认值字段含义
schoolYearCHAR**(12****)TINYINT**NULL NOT NULLYesNo学年
semesterTINYINTNOT NULLYesNo学期
courseNoCHAR(6)NOT NULLYesNo课程代码
courseNameVARCHAR(50)NOT NULLNoNo课程名称
creditNUMERIC(3,1)NOT NULLNoNo学分
creditHourseTINYINTNOT NULLNoNo学时
courseType1CHAR(16)NOT NULLNoNo课程类别
courseType2CHAR(16)NULLNoNo课程性质
cegmentTypeCHAR(16)NULLNoNo环节类别
examineWayCHAR(16)NOT NULLNoNo考核方式
约束条件:
  • 学年取值范围是[1,2,3,4]
  • 学期取值范围是[1,2,3,4,5,6,7,8]
  • 课程代码为6位数字字符且不能为000000
  • 学分取值范围是[ 0.5,1,1.5,2,2.5,3,3.5,4,4.5,5]
  • 学年、学期和课程代码一起构成主码。
学生选课:SelectCourse
字段名数据类型可空性主键外键默认值字段含义
snoCHAR(12)NOT NULLYesYes学号
schoolYearCHAR(12) TINYINTNOT NULL NOT NULLYesYes学年
semesterTINYINTNOT NULLYesYes学期
courseNoCHAR(6)NOT NULLYesYes课程代码
scoreNUMERIC(6,2)NULLNoNo综合成绩
约束条件:
  • 综合成绩为百分制成绩
  • 学号、学年、学期和课程代码一起构成主码。
  • 学号参照表student
  • 学年、学期和课程代码一起参照表course

设计任务:

1. 使用DDL相应的语句完成数据定义操作
(1)用SQL语句(create database)创建数据库,数据库的名字为每位同学自己的拼音姓名和三位学号,例如,xiaojie001
SQL语句如下:
#系统:window10
#SQL语言:MySQL8.0
#创建数据库Lingxue
CREATE DATABASE Lingxue;
(2).在所创建的数据库下,用SQL语句(create table)创建所有的表,只建立主键,先不建立外键。
SQL语句如下:
#使用数据库lingxue
USE lingxue;

#创建Major表
CREATE TABLE Major
(
	majorNo	CHAR(4)	PRIMARY KEY,
	GBMajorNo CHAR(6) NOT NULL,
	majorName VARCHAR(60) NOT NULL,
	enMajorName VARCHAR(100) NULL,
	lengthSchool TINYINT NOT NULL DEFAULT 4,
	eduLevel CHAR(6) NOT NULL DEFAULT '本科',
	ddegree CHAR(12) NOT NULL,
	departmentNo CHAR(2) NOT NULL,
	department VARCHAR(40) NOT NULL
);

#添加约束
#专业代码为4位数字字符且不能为0000 
#国家专业编号为6位数字字符且不能为000000
#院系代码为2位数字字符且不能为00
ALTER TABLE Major
ADD CHECK (majorNo REGEXP '[0-9][0-9][0-9][0-9]' AND majorNo NOT LIKE '0000');
ALTER TABLE Major
ADD CHECK (GBMajorNo REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9]' 
AND majorNo NOT LIKE '000000');
ALTER TABLE Major
ADD CHECK (departmentNo REGEXP '[0-9][0-9]' AND departmentNo NOT LIKE '00');
#创建Students表
CREATE TABLE Students
(
	sno CHAR(12),
	sname CHAR(16),
	sex CHAR(2),
	birthday DATE,
	nationality CHAR(16),
	native CHAR,
	political CHAR(12),
	district CHAR(12),
	studentSource VARCHAR(24),
	enterYear DATE,
	schoolYear CHAR(12),
	class CHAR(24),
	majorNo	CHAR(4)
);
#设置主键
ALTER TABLE `Students` ADD PRIMARY KEY ( `sno` );

#添加约束
ALTER TABLE Students
ADD CHECK (sno REGEXP '[2][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
AND sno NOT LIKE '%00');
ALTER TABLE Students
ADD CHECK (sex in ('男','女'));
#创建Course表
CREATE TABLE Course
(
	schoolYear CHAR(2) NULL,
	semester TINYINT NOT NULL,
	courseNo CHAR(6) NOT NULL,
	courseName VARCHAR(50) NOT NULL,
	credit NUMERIC(3,1) NOT NULL,
	creditHourse TINYINT NOT NULL,
	courseType1	CHAR(16) NOT NULL,
	courseType2	CHAR(16) NULL,
	cegmentType CHAR(16) NULL,
	examineWay CHAR(16) NOT NULL
);
#设置主键
ALTER TABLE Course ADD PRIMARY KEY (schoolYear,semester,courseNo);

#增加约束
#学年取值范围是[1,2,3,4]
#学期取值范围是[1,2,3,4,5,6,7,8]
#课程代码为6位数字字符且不能为000000
#学分取值范围是[ 0.5,1,1.5,2,2.5,3,3.5,4,4.5,5]
ALTER TABLE Course
ADD CHECK (schoolYear >= 1 AND schoolYear <= 4);
ALTER TABLE Course
ADD CHECK (semester >= 1 AND semester <= 8);
ALTER TABLE Course
ADD CHECK (courseNo REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9]' 
AND courseNo NOT LIKE'000000');
ALTER TABLE Course
ADD CHECK (credit in ('0.5','1','1.5','2','2.5','3','3.5','4','4.5','5'));
#创建SelectCourse表
CREATE TABLE SelectCourse
(
	sno CHAR(12) NOT NULL,
	schoolYear CHAR(12) NOT NULL,
	semester TINYINT NOT NULL,
	courseNo CHAR(6) NOT NULL,
	score NUMERIC(6,2) NULL,
	CONSTRAINT SelectCoursePK PRIMARY KEY (sno,schoolYear,semester,courseNo)
);

#增加check约束
#综合成绩为百分制成绩
ALTER TABLE SelectCourse
ADD CHECK (score >= 0 AND score <= 100);
(3)用SQL语句把数据表Students、Course和SelectCourse的schoolYear字段数据类型改为TINYINT,取值范围为(1,2,3,4)。把数据表Students的native字段类型改为char(24)
SQL语句如下:
#修改字段'native'和'schoolYear'类型
ALTER TABLE Students MODIFY COLUMN native CHAR(24);
ALTER TABLE Students MODIFY COLUMN schoolYear TINYINT;
#修改字段'schoolYear'
ALTER TABLE Course MODIFY COLUMN schoolYear TINYINT;
#修改字段'schoolYear'
ALTER TABLE SelectCourse MODIFY COLUMN schoolYear TINYINT;
(4)用SQL的导入导出工具,将已经整理好的对应Excel表的数据全部导入到对应的数据库表中
结果截图如下:

顺序:Major、Students、Course、SelectCourse

Major
Students
Course
SelectCourse

(5)用SQL语句对Student表、SelectCourse表增加外键
  • Student表的majorNo属性参照表Major表中的majorNo属性。
  • SelectCourse表的SNo属性参照表Student表中的SNo属性。
  • SelectCourse表的courseNo属性参照表Course表中的courseNo属性。
  • SelectCourse表的schoolYear属性参照表Course表中的schoolYear属性。
  • SelectCourse表的semester属性参照表Course表中的semester属性。
SQL语句如下:
#添加外键约束
#Student表的majorNo属性参照表Major表中的majorNo属性
ALTER TABLE Students
ADD FOREIGN KEY (majorNo)
REFERENCES Major(majorNo);

#添加外键约束
#SelectCourse表的SNo属性参照表Student表中的SNo属性
#SelectCourse表的courseNo属性参照表Course表中的courseNo属性
#SelectCourse表的schoolYear属性参照表Course表中的schoolYear属性
#SelectCourse表的semester属性参照表Course表中的semester属性
ALTER TABLE SelectCourse
ADD FOREIGN KEY (sno)
REFERENCES Students(sno);

ALTER TABLE SelectCourse
ADD FOREIGN KEY (schoolYear,semester,courseNo) 
REFERENCES Course(schoolYear,semester,courseNo);
2. 使用DML相应的语句完成数据更新操作
(1)用SQL语句将数据表Student、Course和SelectCourse的schoolYear字段值改为3。
SQL语句如下:
#删除外键约束
ALTER TABLE SelectCourse DROP FOREIGN KEY selectcourse_ibfk_2;
#修改字段值
UPDATE Students SET schoolYear = 3; 
UPDATE Course SET schoolYear = 3; 
UPDATE SelectCourse SET schoolYear = 3; 
#添加外键约束
ALTER TABLE SelectCourse
ADD FOREIGN KEY (schoolYear,semester,courseNo) 
REFERENCES Course(schoolYear,semester,courseNo);
(2).用SQL语句,在Student表中增加一条记录,记录的各属性取值对应本人的实际情况。
SQL语句如下:
#插入xx专业
INSERT INTO Major VALUES('3000','083900','xx专业','xx Major',4,'x科','x学','10','xx学院');
#插入本人信息
INSERT INTO Students VALUES ('200000000001','xxx','男','1900-01-01','汉族','中国','群众','xxx校区','中国','1918-09-01',2,'xx1班','3000');
(3)用SQL语句,删除Student表中新增的对应于本人的记录
SQL语句如下:
DELETE FROM Students
WHERE sno='200000000001';
(4)用SQL语句,完成对以下表的数据删除操作
  • 删除Student表中记录的majorNo值不在Major表中出现的相应记录
  • 删除SelectCourse表中记录的courseNo值不在Course表中出现的相应记录
  • 删除SelectCourse表中记录的sno值不在Student表中出现的相应记录
SQL语句如下:
#删除Students表中majorNo不存在Major的数据
DELETE 
FROM Students
WHERE majorNo NOT IN (SELECT majorNo FROM Major);

#删除SelectCourse表中sno不存在Students的数据
DELETE 
FROM SelectCourse
WHERE sno NOT IN (SELECT sno FROM Students);

#删除SelectCourse表中courseNo不存在Students的数据
DELETE 
FROM SelectCourse
WHERE courseNo NOT IN (SELECT courseNo FROM Course);

语句如下:

#删除Students表中majorNo不存在Major的数据
DELETE 
FROM Students
WHERE majorNo NOT IN (SELECT majorNo FROM Major);

#删除SelectCourse表中sno不存在Students的数据
DELETE 
FROM SelectCourse
WHERE sno NOT IN (SELECT sno FROM Students);

#删除SelectCourse表中courseNo不存在Students的数据
DELETE 
FROM SelectCourse
WHERE courseNo NOT IN (SELECT courseNo FROM Course);
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐