数据库数据删除与修改实验
数据库数据删除与修改实验
在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本文将详细复盘实验内容,总结关键操作要点与典型问题。
一、实验准备:环境与数据初始化
1. 软硬件环境
- 硬件:PC 单机
- 软件:Windows 11 + SQL Server 2022
- 核心表: - STUDENT057(学生表)、- SCORE057(成绩表)、- Course057(课程表) 、- TEACHER057(教师表)
 
2. 数据生成
-- 创建学生实验表(复制原始数据)
SELECT * INTO STUDENTA057 FROM STUDENT057;-- 创建成绩实验表(先过滤无效数据,再插入全量数据)
SELECT * INTO SCOREA057 FROM SCORE057 WHERE DEGREE < 0; -- 初始空表(假设无负数成绩)
INSERT INTO SCOREA057 SELECT * FROM SCORE057; -- 插入全部成绩数据

二、验证性实验:基础操作与语法验证
1. 数据修改(UPDATE)
(1)单表条件修改
-  场景1:批量调整出生日期 -- 所有人出生日期月份减1 UPDATE STUDENTA057 SET Sbirthday = DATEADD(MONTH, -1, Sbirthday); -- 特定学生:陈文文年份加1,班级修改 UPDATE STUDENTA057 SET Sbirthday = DATEADD(YEAR, 1, Sbirthday), Class = '95033' WHERE Sname = '陈文文'; 
-  场景2:分组差异化修改(CASE-WHEN) -- 95033班男生日期减1天,女生加1天 UPDATE STUDENTA057 SET Sbirthday = CASE Ssex WHEN '男' THEN DATEADD(DAY, -1, Sbirthday)WHEN '女' THEN DATEADD(DAY, 1, Sbirthday)END WHERE Class = '95033';

(2)多表关联修改
-  场景3:通过学生表修改成绩表数据 -- 李君帅所有成绩减10(JOIN关联学生与成绩表) UPDATE SC SET Degree = Degree - 10 FROM STUDENTA057 S JOIN SCOREA057 SC ON S.Sno = SC.Sno WHERE S.Sname = '李君帅'; -- 李君帅的“计算机导论”成绩加10(三表JOIN) UPDATE SC SET Degree = Degree + 10 FROM STUDENTA057 S JOIN SCOREA057 SC ON S.Sno = SC.Sno JOIN Course C ON SC.CNO = C.CNO WHERE S.Sname = '李君帅' AND C.Cname = '计算机导论'; 
2. 数据删除(DELETE)实战
(1)精准条件删除
- 场景1:单条件/多条件过滤-- 删除学号109、课程3-245的成绩 DELETE FROM SCOREA057 WHERE SNO = '109' AND CNO = '3-245';

-- 子查询定位:曾华庆的“数字电路”成绩
DELETE FROM SCOREA057 
WHERE SNO = (SELECT Sno FROM STUDENTA057 WHERE Sname = '曾华庆') AND CNO = (SELECT CNO FROM Course WHERE Cname = '数字电路');

(2)表清空操作对比
-- 快速清空表(不可回滚,效率高)
TRUNCATE TABLE STUDENTA057;

-- 逐行删除(支持事务,可带WHERE)
DELETE FROM SCOREA057;

3. 特殊语法测试
(1)SET ANSI_NULLS:NULL值比较规则
-  ON(默认): = NULL和<>无效,必须用IS NULL/IS NOT NULLSELECT * FROM SCORE057 WHERE DEGREE IS NOT NULL; -- 有效 SELECT * FROM SCORE057 WHERE DEGREE = NULL; -- 无结果(ANSI标准)
-  OFF:非标准行为, = NULL可能返回NULL值行(不推荐使用)
区别:
- ON :语句一返回结果集,语句二无结果
- OFF:语句一和语句二都会返回结果集
(2)SET QUOTED_IDENTIFIER:标识符引号
- ON:双引号用于标识符(需谨慎),推荐用 [](如[CNO])
- OFF:双引号可作字符串,但兼容性差,统一用 []更安全
(3)TOP WITH TIES:返回并列数据
-- 前3条记录(无排序时随机)
SELECT TOP 3 * FROM SCORE057;

-- 前3条及并列(需ORDER BY)
SELECT TOP 3 WITH TIES * FROM SCORE057 ORDER BY Degree DESC;

 无order by时会出现以下报错:
 
(4)ANY/SOME/ALL:集合比较
- ANY/SOME:满足任意一个条件(如 Degree < ANY(...)表示小于子查询中的某个值)
- ALL:满足所有条件(如 Degree >= ALL(...)筛选最大值行)
三、设计性实验:复杂业务逻辑实现
1. 高阶数据修改(单语句完成)
(1)复合条件与边界控制
-  场景1:姓名与日期同时修改 -- 陈文文改名为陈文,出生日期年月日各加1 UPDATE STUDENTA057 SET Sname = '陈文', Sbirthday = DATEADD(DAY, 1, DATEADD(MONTH, 1, DATEADD(YEAR, 1, Sbirthday))) WHERE Sname = '陈文文';修改前: 
  修改后: 
  
-  场景2:成绩上限控制(加10后不超过100) UPDATE SCOREA057 SET Degree = CASE WHEN Degree + 10 > 100 THEN 100 ELSE Degree + 10 END WHERE SNO = '101';修改前: 
  修改后: 
  
(2)多表关联与分组处理
-  场景3:按性别差异化加分(男生加10%,女生加10) UPDATE SC SET Degree = CASE S.Ssex WHEN '男' THEN IIF(SC.Degree * 1.1 > 100, 100, SC.Degree * 1.1)WHEN '女' THEN IIF(SC.Degree + 10 > 100, 100, SC.Degree + 10)END FROM STUDENTA057 S JOIN SCOREA057 SC ON S.Sno = SC.Sno;修改前: 
  修改后: 
  
2. 复杂数据删除(多条件关联)
(1)跨表关联删除
- 场景1:删除女生的“计算机导论”成绩
  DELETE SC FROM SCOREA057 SC JOIN STUDENTA057 S ON SC.Sno = S.Sno JOIN Course057 C ON SC.CNO = C.CNO WHERE S.Ssex = '女' AND C.Cname = '计算机导论';--也可以使用子查询DELETE FROM SCOREA057 WHERE
SNO = ANY(SELECT SNO FROM STUDENTA057 WHERE Ssex='女') AND
CNO = ANY (SELECT CNO FROM Course057 WHERE CNAME='计算机导论')删除前:
 
删除后:
 
(2)动态条件删除(本月过生日的男同学)
-- 当前月过生日的男同学(MONTH函数匹配)
DELETE FROM STUDENTA057 
WHERE Ssex = '男' AND MONTH(Sbirthday) = MONTH(GETDATE());
删除前:
 
删除后:
 
四、实践中的典型问题与解决
1. 子查询返回多值错误
- 问题:SNO = (SELECT SNO FROM STUDENTA057 WHERE Ssex='女')报错(子查询返回多个学号)
- 解决:改用 SNO = ANY(...)或IN(...),匹配集合中的任意值
2. NULL值导致的逻辑失效
- 场景:Degree >= ALL(SELECT degree FROM SCORE057)无结果(因存在NULL值)
- 解决:子查询添加 WHERE Degree IS NOT NULL,排除无效NULL值
五、实验总结:
1. 核心技能
- 数据修改:掌握 UPDATE的单表/多表操作、CASE-WHEN条件分支、边界值控制(如成绩≤100)。
- 数据删除:区分 DELETE(灵活过滤)与TRUNCATE(快速清空),重视WHERE条件的严谨性。
- 语法细节:理解 ANSI_NULLS、QUOTED_IDENTIFIER对SQL行为的影响,规范使用IS NULL、[]等标准语法。
2. 实践中的“避坑”经验
- 先测试后执行:复杂语句先通过子查询验证中间结果(如单独运行 SELECT CNO FROM Course WHERE Cname='计算机导论')。
- 备份优先:删除/修改前备份数据,避免误操作(如 TRUNCATE不可回滚,需谨慎)。
3. 对数据库操作的再认识
此次实验让我全面掌握了数据操作的 UPDATE 和 DELETE 语句,学会运用函数(如 DATEADD)修改数据,也明白了 TRUNCATE TABLE 与 DELETE 在清空表数据时的区别及适用场景。同时,对 SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 等设置有了更深入的理解,知晓其对 NULL 值比较和标识符引号使用的影响。在多表连接与子查询的应用方面,也积累了丰富的实践经验,能够准确关联表并处理复杂查询。
