尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

实验七:查询(5)——数据更新与视图实战解析

实验七:查询(5)——数据更新与视图实战解析 1. 教务管理系统中的数据更新实战在教务管理系统中数据更新是最基础也最频繁的操作之一。记得我第一次接触教务系统开发时最常遇到的问题就是数据更新语句写错导致整个班级信息混乱。下面我们就通过几个典型场景来看看如何正确使用SQL进行数据更新。先来看一个最简单的例子新增课程。理学院要开设一门新课数学建模课程编号20学分4学时72属于选修课最多选课人数50人。对应的SQL语句非常简单INSERT INTO course VALUES(20,NULL,CS,数学建模,4,72,选修,50);这里有几个关键点需要注意课程编号作为主键必须唯一由于这门课没有先修课程所以第二个参数设为NULL院系代码CS必须与院系表中的数据一致实际工作中我遇到过很多因为字段顺序不对导致插入失败的情况。建议在不确定表结构时先使用DESCRIBE命令查看表结构DESCRIBE course;另一个常见操作是修改学生信息。比如要将学号为012005001的学生班级改为计算机科学与技术2班同时清空联系电话UPDATE student SET GId02, STeleNULL WHERE SId012005001;这里最容易犯的错误是忘记加WHERE条件导致更新了整张表。我曾经在一次测试中不小心执行了不带WHERE的UPDATE结果整个年级的学生班级都被改成了同一个不得不从备份恢复数据。成绩调整也是教务系统中的高频操作。比如有个特殊规则如果学生平时成绩大于90但总评成绩低于70需要将总评成绩调整为70。这个逻辑需要用到条件更新UPDATE sc SET SCScore70 WHERE SCScore1 90 AND SCScore 70;这种业务逻辑在实际系统中很常见建议先在测试环境验证SQL的正确性再在生产环境执行。我曾经遇到过因为条件写反导致成绩被错误调整的情况最后只能手动一个个恢复。2. 数据删除操作的关键要点删除操作在数据库管理中是最危险的操作之一因为一旦执行就无法撤销。在教务系统中删除操作需要特别谨慎。最常见的删除场景是清理不合格的选课记录。比如要删除所有期末成绩小于60分的选课记录DELETE FROM sc WHERE SCScore3 60;执行这类操作前强烈建议先使用SELECT语句确认要删除的数据SELECT * FROM sc WHERE SCScore3 60;我曾经帮学校处理过一个紧急情况有老师误删了整个学期的选课记录。幸好数据库有定时备份最终恢复了数据但导致系统停用了半天。从此以后我都会在执行DELETE前先备份相关数据。另一个典型场景是删除特定学生的所有选课记录。比如学号为012005001的学生退学需要删除其所有选课记录DELETE FROM sc WHERE SId 012005001;这种操作在事务处理中特别重要。在实际开发中我通常会把这些删除操作放在事务中确保要么全部成功要么全部回滚BEGIN; DELETE FROM sc WHERE SId 012005001; DELETE FROM student WHERE SId 012005001; COMMIT;复杂的删除操作可能需要使用子查询。例如要删除所有选修了数据库课程的选课记录DELETE FROM sc WHERE CId IN (SELECT CId FROM course WHERE CName 数据库);这类操作一定要先在测试环境验证确保子查询返回的结果确实是想要删除的记录。我曾经遇到过因为课程名称有空格或大小写不一致导致删除条件不匹配的情况。3. 视图的创建与应用实战视图是数据库系统中非常实用的功能它相当于一个虚拟表可以简化复杂查询提高数据安全性。在教务系统中视图的应用场景非常多。3.1 统计未选课学生信息每学期初教务处需要统计没有选任何课程的学生名单。我们可以创建一个视图来简化这个查询CREATE VIEW V_StudentsWithoutCourse(Sno,Sname,Ssex,Sage,Sdept) AS SELECT * FROM Student WHERE Sno NOT IN (SELECT Sno FROM SC);这个视图的使用非常简单SELECT * FROM V_StudentsWithoutCourse;在实际项目中我发现这类视图对辅导员特别有用他们可以定期检查未选课学生名单及时跟进学生情况。视图的另一个优势是当底层表结构变化时只需要修改视图定义不需要修改应用程序代码。3.2 重修名单统计视图学期末教务处需要统计需要重修的学生名单。假设成绩低于60分或成绩为NULL的学生需要重修我们可以创建如下视图CREATE VIEW V_RestudyList AS SELECT Sdept,a.Sno,Sname,Cname FROM (SELECT * FROM SC WHERE Grade 60 OR Grade IS NULL) AS a LEFT JOIN Course ON a.Cno Course.Cno LEFT JOIN Student ON Student.Sno a.Sno;这个视图做了三表关联将学生信息、课程信息和成绩信息整合在一起。在实际使用中我发现这类复杂视图可以显著简化前端开发工作因为应用程序只需要查询视图不需要处理复杂的关联逻辑。视图的维护也很重要。随着业务需求变化可能需要修改视图定义。例如要增加筛选特定学期的重修学生CREATE OR REPLACE VIEW V_RestudyList AS SELECT Sdept,a.Sno,Sname,Cname FROM (SELECT * FROM SC WHERE (Grade 60 OR Grade IS NULL) AND Semester2023-2024-1) AS a LEFT JOIN Course ON a.Cno Course.Cno LEFT JOIN Student ON Student.Sno a.Sno;4. 教务管理中的综合案例解析让我们通过几个综合案例把前面学到的数据更新和视图知识融会贯通。4.1 新教师课程安排学校新来了洪玉飞老师(教师编号03012)需要安排他教授软件工程1班(班级编号04)的数据库课程(课程编号1)上课教室为NB201上课学年学期为2021-2022-2每周5的34节课。这个操作涉及向课程信息表插入新记录INSERT INTO information VALUES(NULL,1,03012,04,NB201,5,34,2021-2022-2);这里主键设为NULL是因为表设置了自增主键。在实际系统中课程安排需要考虑很多约束条件比如同一时间同一教室不能安排两门课教师在同一时间不能上两门课班级在同一时间不能上两门课因此在实际应用中这类操作通常会有一系列的前置检查。4.2 学生联系方式更新学生李飞换了新手机号需要更新联系方式UPDATE student SET STele661010 WHERE SName李飞;这个简单的更新操作在实际中可能遇到的问题是学生重名。更安全的做法是结合学号进行更新UPDATE student SET STele661010 WHERE SId012005002 AND SName李飞;4.3 复杂业务规则实现教务系统中经常会有一些特殊的业务规则。比如如果平时成绩大于90则将总评成绩低于70的重置为70。这个规则可以用一条UPDATE语句实现UPDATE sc SET SCScore70 WHERE SCScore1 90 AND SCScore 70;但在实际开发中我建议把这类业务规则放在存储过程中并添加适当的日志记录CREATE PROCEDURE adjust_final_score() BEGIN DECLARE rows_affected INT; UPDATE sc SET SCScore70 WHERE SCScore1 90 AND SCScore 70; SET rows_affected ROW_COUNT(); INSERT INTO operation_log VALUES(NOW(), adjust_final_score, rows_affected); END;这样既方便重复执行也便于追踪数据变更历史。
返回列表