mysql查询各类课程的总学分_数据库结构设计

本文探讨了如何通过减少数据冗余、避免更新异常,确保在数据库设计中如学生选课表的完整性。插入异常示例解释了当新课程需要关联已有学生时的约束;更新异常则关注多行同步更新的问题。优化策略涉及存储空间节省和SQL查询效率提升。
摘要由CSDN通过智能技术生成

1. 减少数据冗余。

2. 尽量避免数据维护中出现更新,插入和删除异常。

插入异常: 如果表中的某个实体随着另一个实体而存在

更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新

删除异常:如果删除表中的某一实体则会导致其他实体的消息

3. 节约存储空间

4. 提高SQL的查询效率

如何理解插入异常?

假设这是我们当前设计的表结构。在这个表,存在着两个实体。其中一个实体是学生信息,另一个实体是课程信息。PRIMARY KEY (study_no,course_name) 表明一个学生只能选择相同的课程一次。当前我们只插入以下语句时,

insert into selectcourse(course_name, course_point) values('语文', 10)

则会产生异常。在没有学生选择这门课时,无法把新课程插入到表中。这也就是表中的某个实体随着另一个实体而存在。

CREATE TABLE `selectcourse` (

`study_no` int NOT NULL COMMENT '学号',

`study_name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',

`birth_date` timestamp NOT NULL COMMENT '生日',

`course_name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称',

`score` int DEFAULT NULL COMMENT '成绩',

`course_point` int NOT NULL COMMENT '学分',

PRIMARY KEY (`study_no`,`course_name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

如何理解更新异常呢?

mysql> select * from selectcourse;

+----------+------------+---------------------+-------------+-------+--------------+

| study_no | study_name | birth_date | course_name | score | course_point |

+----------+------------+---------------------+-------------+-------+--------------+

| 1 | 张三 | 2021-01-26 14:32:36 | 数学 | NULL | 10 |

| 1 | 张三 | 2021-01-26 14:34:53 | 英语 | NULL | 9 |

| 2 | 李四 | 2021-01-26 14:35:26 | 数学 | NULL | 10 |

| 2 | 李四 | 2021-01-26 14:35:47 | 英语 | NULL | 9 |

+----------+------------+---------------------+-------------+-------+--------------+

4 rows in set (0.00 sec)

假设我们要更新数学该科目的学分:

update selectcourse set course_point=15 where course_name='数学'

我们会看到以下执行结果:

mysql> update selectcourse set course_point=15 where course_name='数学';

Query OK, 2 rows affected (0.00 sec)

Rows matched: 2 Changed: 2 Warnings: 0

我们可以看到其更新了2行数据。这也就意味着选择该科目的学员越多,更新的学分【行】也就越多。这就是更新异常的具体表现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值