数据库数据删除与修改实验
数据库数据删除与修改实验
在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 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 NULL
SELECT * 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 值比较和标识符引号使用的影响。在多表连接与子查询的应用方面,也积累了丰富的实践经验,能够准确关联表并处理复杂查询。