当前位置: 首页 > news >正文

数据库数据删除与修改实验

数据库数据删除与修改实验

在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATEDELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本文将详细复盘实验内容,总结关键操作要点与典型问题。

一、实验准备:环境与数据初始化

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_NULLSQUOTED_IDENTIFIER 对SQL行为的影响,规范使用 IS NULL[] 等标准语法。

2. 实践中的“避坑”经验

  • 先测试后执行:复杂语句先通过子查询验证中间结果(如单独运行 SELECT CNO FROM Course WHERE Cname='计算机导论')。
  • 备份优先:删除/修改前备份数据,避免误操作(如 TRUNCATE 不可回滚,需谨慎)。

3. 对数据库操作的再认识

此次实验让我全面掌握了数据操作的 UPDATEDELETE 语句,学会运用函数(如 DATEADD)修改数据,也明白了 TRUNCATE TABLEDELETE 在清空表数据时的区别及适用场景。同时,对 SET ANSI_NULLSSET QUOTED_IDENTIFIER 等设置有了更深入的理解,知晓其对 NULL 值比较和标识符引号使用的影响。在多表连接与子查询的应用方面,也积累了丰富的实践经验,能够准确关联表并处理复杂查询。

相关文章:

  • 第十届电气、电子和计算机工程研究国际学术研讨会(ISAEECE 2025)
  • 携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放
  • 中篇:深入剖析 L2CAP 与 ATT 协议模块(约5000字)
  • C++ round 函数笔记 (适用于算法竞赛)
  • Spring Boot实战(三十六)编写单元测试
  • matlab 绘图
  • 手搓雷达图(MATLAB)
  • 网络安全 | F5 WAF 黑白名单配置实践指南
  • ArcGIS Pro跨图层复制粘贴
  • 第十三届蓝桥杯 2022 C/C++组 修剪灌木
  • 抖音的逆向工程获取弹幕(websocket和protobuf解析)
  • 【QT网络】构建简单Udp回显服务器
  • Flutter Dart 循环语句 for while do..while break、continue
  • CGAL 网格内部生成随机点
  • 图论---朴素Prim(稠密图)
  • Linux内核netlink机制 - 连接器(Netlink Connector)
  • 解决cannot find attribute `serde` in this scope记录
  • 远程访问服务器的Jupyter Notebook
  • 生成随机验证码-解析与优化
  • 代码随想录算法训练营第一天:数组part1
  • 今年五一,贵州一脸“爆相”
  • 贝壳:网传“深圳贝壳内部通知”不实
  • 鸿蒙智行八大车型亮相上海车展,余承东拉上三家车企老总“直播推销”
  • 国防部:希望美方不要有“受迫害妄想症”,总拿别人当借口
  • 嫦娥五号《月球样品借用协议》签约,2025中国航天公益形象大使公布
  • 神十九乘组视频祝福第十个中国航天日,展望中华民族登月梦圆