MySQL练习——教学系统数据库设计

目录

 

1. 教学系统概述

2. 数据库结构设计

3. 教学系统测试

 


1. 教学系统概述

根据大学生教学系统的原型设计出如下的ER关系图,主要来练习数据库系统的搭建:

上图一共包含五个实体,分别是学生,教师,课程,院系,行政班级:

  1. 其中学生和课程的关系是多对多,即一个学生可以选择多门课程,而一个课程又有多个学生选择。每个学生的每门课程都有一个成绩,所以选课表中应该有成绩字段。
  2. 课程和教师是多对一关系,即一个教师只教一门课程,而一个课程又由多位老师教授。
  3. 教师和院系是一对多的关系,即一个教师只属于一个院系,而一个院系可以聘请多位老师。
  4. 行政班级和院系是多对一的关系,即一个院系有多个行政班级,而一个行政班级只属于一个院系。
  5. 学生和行政班级是多对一的关系,即一个行政班级有多个学生,而一个学生只属于一个行政班级。

2. 数据库结构设计

根据以上分析利用MySQLWorkbench软件构建成E-R模型:

 设计完成后,直接导出SQL执行脚本:

创建脚本如下:

-- -----------------------------------------------------
-- Table `course`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `course` ;

CREATE TABLE IF NOT EXISTS `course` (
  `cou_id` INT NOT NULL ,
  `cou_name` VARCHAR(45) NULL ,
  `cou_score` CHAR(2) NULL ,
  `cou_info` TEXT NULL ,
  `cou_limit` INT NULL ,
  PRIMARY KEY (`cou_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `department`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `department` ;

CREATE TABLE IF NOT EXISTS `department` (
  `dep_id` INT NOT NULL ,
  `dep_name` VARCHAR(45) NULL ,
  `dep_info` TEXT NULL ,
  PRIMARY KEY (`dep_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `class`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `class` ;

CREATE TABLE IF NOT EXISTS `class` (
  `cls_id` INT NOT NULL ,
  `dep_id` INT NULL ,
  PRIMARY KEY (`cls_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `student`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `student` ;

CREATE TABLE IF NOT EXISTS `student` (
  `stu_id` INT NOT NULL ,
  `stu_name` VARCHAR(45) NULL ,
  `stu_grade` CHAR(2) NULL ,
  `stu_sex` CHAR(2) NULL ,
  `cls_id` INT NULL ,
  `stu_hobby` VARCHAR(45) NULL ,
  `stu_birth` DATE NULL ,
  PRIMARY KEY (`stu_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `choose_course`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `choose_course` ;

CREATE TABLE IF NOT EXISTS `choose_course` (
  `stu_id` INT NOT NULL ,
  `cou_id` INT NOT NULL ,
  `stu_cou_score` INT NULL ,
  PRIMARY KEY (`stu_id`, `cou_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `techer`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `teacher` ;

CREATE TABLE IF NOT EXISTS `teacher` (
  `tec_id` INT NOT NULL ,
  `tec_name` VARCHAR(45) NULL ,
  `dep_id` INT NULL ,
  PRIMARY KEY (`tec_id`)  )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- ALTER Table FOREIGN KEY
-- -----------------------------------------------------
ALTER TABLE student ADD CONSTRAINT fk_student_class FOREIGN KEY (cls_id) REFERENCES class (cls_id);
ALTER TABLE teacher ADD CONSTRAINT fk_teacher_department FOREIGN KEY (dep_id) REFERENCES department (dep_id);
ALTER TABLE class ADD CONSTRAINT fk_classes_department FOREIGN KEY (dep_id) REFERENCES department (dep_id);
ALTER TABLE choose_course ADD CONSTRAINT fk_choose_course_course FOREIGN KEY (cou_id) REFERENCES course (cou_id);
ALTER TABLE choose_course ADD CONSTRAINT fk_choose_course_student FOREIGN KEY (stu_id) REFERENCES student (stu_id);

 将创建脚本导入Navicat中,添加数据,最终导出结果如下:

/*
Navicat MySQL Data Transfer

Source Server         : local_mysql
Source Server Version : 50626
Source Host           : localhost:3306
Source Database       : mytest

Target Server Type    : MYSQL
Target Server Version : 50626
File Encoding         : 65001

Date: 2020-10-25 15:01:50
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for choose_course
-- ----------------------------
DROP TABLE IF EXISTS `choose_course`;
CREATE TABLE `choose_course` (
  `stu_id` int(11) NOT NULL,
  `cou_id` int(11) NOT NULL,
  `stu_cou_score` int(11) DEFAULT NULL,
  PRIMARY KEY (`stu_id`,`cou_id`),
  KEY `fk_choose_course_course` (`cou_id`),
  CONSTRAINT `fk_choose_course_course` FOREIGN KEY (`cou_id`) REFERENCES `course` (`cou_id`),
  CONSTRAINT `fk_choose_course_student` FOREIGN KEY (`stu_id`) REFERENCES `student` (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of choose_course
-- ----------------------------
INSERT INTO `choose_course` VALUES ('1001', '30010001', '80');
INSERT INTO `choose_course` VALUES ('1001', '30010002', '90');
INSERT INTO `choose_course` VALUES ('1002', '30050001', '70');
INSERT INTO `choose_course` VALUES ('1003', '30020001', '95');

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cls_id` int(11) NOT NULL,
  `dep_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`cls_id`),
  KEY `fk_classes_department` (`dep_id`),
  CONSTRAINT `fk_classes_department` FOREIGN KEY (`dep_id`) REFERENCES `department` (`dep_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('2020001', '3001');
INSERT INTO `class` VALUES ('2020002', '3002');
INSERT INTO `class` VALUES ('2020003', '3003');
INSERT INTO `class` VALUES ('2020004', '3004');
INSERT INTO `class` VALUES ('2020005', '3005');
INSERT INTO `class` VALUES ('2020006', '3006');

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cou_id` int(11) NOT NULL,
  `cou_name` varchar(45) DEFAULT NULL,
  `cou_score` char(2) DEFAULT NULL,
  `cou_info` text,
  `cou_limit` int(11) DEFAULT NULL,
  PRIMARY KEY (`cou_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('30010001', '计算机组成原理', '3', '讲解计算机组成原理知识', '50');
INSERT INTO `course` VALUES ('30010002', 'C++程序设计', '5', 'C++程序设计与实践', '80');
INSERT INTO `course` VALUES ('30020001', '管理学', '2', '管理相关知识', '40');
INSERT INTO `course` VALUES ('30030001', '机械加工与设计', '2', '介绍机械加工原理以及设计基础', '50');
INSERT INTO `course` VALUES ('30040001', '自动控制原理', '4', '自动控制原理相关知识', '50');
INSERT INTO `course` VALUES ('30050001', '化工理论', '3', '化工基础理论知识', '60');

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `dep_id` int(11) NOT NULL,
  `dep_name` varchar(45) DEFAULT NULL,
  `dep_info` text,
  PRIMARY KEY (`dep_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES ('3001', '计算机学院', '计算机相关课程');
INSERT INTO `department` VALUES ('3002', '经管学院', '经济管理课程');
INSERT INTO `department` VALUES ('3003', '机械学院', '机械加工制造课程');
INSERT INTO `department` VALUES ('3004', '自动化学院', '自动化原理课程');
INSERT INTO `department` VALUES ('3005', '化工学院', '化工课程');
INSERT INTO `department` VALUES ('3006', '材料学院', '材料与分子课程');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `stu_id` int(11) NOT NULL,
  `stu_name` varchar(45) DEFAULT NULL,
  `stu_grade` char(2) DEFAULT NULL,
  `stu_sex` char(2) DEFAULT NULL,
  `cls_id` int(11) DEFAULT NULL,
  `stu_hobby` varchar(45) DEFAULT NULL,
  `stu_birth` date DEFAULT NULL,
  PRIMARY KEY (`stu_id`),
  KEY `fk_student_class` (`cls_id`),
  CONSTRAINT `fk_student_class` FOREIGN KEY (`cls_id`) REFERENCES `class` (`cls_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1001', '李明', '大三', '男', '2020001', '游泳', '2000-06-14');
INSERT INTO `student` VALUES ('1002', '肖潇', '大一', '女', '2020005', '音乐', '2000-05-02');
INSERT INTO `student` VALUES ('1003', '张默', '大二', '男', '2020002', '足球', '2020-10-30');

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tec_id` int(11) NOT NULL,
  `tec_name` varchar(45) DEFAULT NULL,
  `dep_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`tec_id`),
  KEY `fk_teacher_department` (`dep_id`),
  CONSTRAINT `fk_teacher_department` FOREIGN KEY (`dep_id`) REFERENCES `department` (`dep_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('20001', '韩明', '3006');
INSERT INTO `teacher` VALUES ('20002', '陆函', '3004');
INSERT INTO `teacher` VALUES ('20003', '黄勤', '3002');
INSERT INTO `teacher` VALUES ('20004', '高潇潇', '3001');
INSERT INTO `teacher` VALUES ('20005', '李晓飞', '3003');

3. 教学系统测试

查找学生id为1001所选课程:

mysql> select cou_name from course where cou_id in (select cou_id from choose_course where stu_id=1001);
+----------------+
| cou_name       |
+----------------+
| 计算机组成原理 |
| C++程序设计    |
+----------------+
2 rows in set

查找学生id为1001所在院系、课程、分数:

mysql> select a.dep_name,a.dep_info,b.cou_name,c.stu_cou_score,d.stu_name from department as a ,course as b ,
choose_course as c , student as d,class as e where d.stu_id=1001
 and a.dep_id=e.dep_id and d.cls_id=e.cls_id and d.stu_id=c.stu_id and c.cou_id=b.cou_id;
+------------+----------------+----------------+---------------+----------+
| dep_name   | dep_info       | cou_name       | stu_cou_score | stu_name |
+------------+----------------+----------------+---------------+----------+
| 计算机学院 | 计算机相关课程 | 计算机组成原理 |            80 | 李明     |
| 计算机学院 | 计算机相关课程 | C++程序设计    |            90 | 李明     |
+------------+----------------+----------------+---------------+----------+
2 rows in set

 

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Sakila是MySQL官方提供的一个样例数据库,用于演示和练习MySQL数据库的使用。数据库包含了一个虚构的DVD租赁店的数据,其中包括客户、电影、租赁记录等等。 Sakila数据库包含16张表,包括: 1. `actor`:演员表,包含演员的ID、名字和最后更新时间。 2. `address`:地址表,包含地址的ID、地址、邮编、电话和最后更新时间。 3. `category`:电影类别表,包含类别的ID和名称以及最后更新时间。 4. `city`:城市表,包含城市的ID、城市名称、国家ID和最后更新时间。 5. `country`:国家表,包含国家的ID、国家名称和最后更新时间。 6. `customer`:客户表,包含客户的ID、姓名、地址、邮编、电话、积分、注释和最后更新时间。 7. `film`:电影表,包含电影的ID、标题、描述、发行年份、语言ID、原始语言ID、租金、长度、评级和最后更新时间。 8. `film_actor`:电影演员表,包含电影ID和演员ID。 9. `film_category`:电影类别表,包含电影ID和类别ID。 10. `inventory`:库存表,包含DVD的ID、电影ID和最后更新时间。 11. `language`:语言表,包含语言的ID、名称和最后更新时间。 12. `payment`:支付表,包含支付的ID、客户ID、租赁ID、支付时间、租赁时长和支付金额。 13. `rental`:租赁表,包含租赁的ID、客户ID、电影ID、租赁时间和最后更新时间。 14. `staff`:员工表,包含员工的ID、姓名、地址、邮编、电话、邮箱、店铺ID、用户名、密码和最后更新时间。 15. `store`:店铺表,包含店铺的ID、地址、邮编、电话和最后更新时间。 16. `sales_by_film_category`:按电影类别统计销售额的视图,包含类别名称和销售额。 使用Sakila数据库可以练习SQL查询、联结、聚合、子查询等等操作,是学习MySQL的很好的工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值