数据更新与删除 核心详细教程
核心总览
本章核心是SQL两大核心数据写操作(DML操作),直接修改数据库中的持久化数据,操作后会永久生效(无事务回滚情况下),因此核心原则:先查后操作,无WHERE条件绝不执行,安全优先。
两大核心操作区别:
UPDATE:仅修改表中已有记录的指定字段值,不新增、不删除行,原有行结构保持不变;
DELETE:直接删除表中的整行记录,仅保留表结构、索引和约束,删除后的数据难以恢复。
贯穿全教程的基础表(5个属性,简洁实用)
1. 表结构:员工表staff(适配日常业务场景,仅5个核心字段)
| 字段名 | 数据类型 | 字段说明 | 约束条件 | 补充说明 |
|---|---|---|---|---|
| staff_id | INT | 员工编号 | 主键(PRIMARY KEY)、唯一 | 唯一标识员工,用于精准定位单条记录 |
| staff_name | VARCHAR(20) | 员工姓名 | 非空(NOT NULL) | 不可为空,确保每条记录都有员工姓名 |
| dept | VARCHAR(20) | 所属部门 | 无 | 可用于批量筛选(如销售部、技术部) |
| salary | INT | 月薪(元) | 无 | 数值类型,支持算术运算(如涨薪、降薪) |
| entry_date | DATE | 入职日期 | 无 | 日期类型,支持范围筛选(如入职时间范围) |
2. 初始测试数据(全教程所有操作均基于此数据,可直接复制执行)
-- 1. 建表语句(确保表结构正确,适配后续所有操作)
CREATE TABLE staff (
staff_id INT PRIMARY KEY, -- 主键,唯一标识员工
staff_name VARCHAR(20) NOT NULL, -- 员工姓名,不可为空
dept VARCHAR(20), -- 所属部门
salary INT, -- 月薪
entry_date DATE -- 入职日期
);
-- 2. 插入初始测试数据(4条记录,覆盖不同部门、薪资、入职日期)
INSERT INTO staff VALUES
(1, '张三', '销售部', 6000, '2022-03-15'),
(2, '李四', '技术部', 8000, '2021-07-01'),
(3, '王五', '销售部', 5500, '2023-01-10'),
(4, '赵六', '行政部', 4500, '2022-09-20');
一、UPDATE 数据更新(核心操作,详细拆解)
1. 核心语法&详细拆解(生产环境唯一推荐写法)
UPDATE 表名
SET 字段1=新值1, 字段2=新值2, ... -- 核心赋值部分,支持多字段同时修改
WHERE 筛选条件; -- 安全核心,锁定要修改的记录范围,不可省略(除非特殊需求)
语法详细说明
UPDATE 表名:指定要修改数据的目标表,不可写错表名,否则会修改错误表的数据;
SET 子句:用于指定要修改的字段和对应新值,支持3种赋值方式:
固定常量值:如 salary=6500,直接给字段赋具体值;
字段自身运算:如 salary=salary*1.1(薪资涨10%),基于字段原有值计算后覆盖;
简单表达式:如 dept='营销部'(部门名称修改),适用于字符类型字段。
WHERE 子句:筛选要修改的记录,核心作用是“缩小修改范围”,避免误改全表;筛选条件可结合字段值、逻辑运算符(AND/OR)使用。
连贯实操示例(基于staff表,覆盖不同场景)
-- 示例1:修改单条记录(精准修改,零风险)
-- 需求:修改员工编号1(张三)的月薪为6500元,同时补充其部门备注(无则不修改)
-- 安全操作步骤:先查询确认要修改的记录,再执行更新
SELECT * FROM staff WHERE staff_id=1; -- 先查:确认张三的当前信息,避免修改错误
UPDATE staff
SET salary=6500 -- 仅修改薪资字段,其他字段不变
WHERE staff_id=1; -- 用主键筛选,精准锁定1条记录,无误改风险
-- 示例2:批量修改多条记录(多字段同时修改)
-- 需求:给销售部所有员工薪资涨10%,同时将部门名称统一改为「营销部」
-- 安全操作步骤:先查询销售部员工,确认范围后再更新
SELECT * FROM staff WHERE dept='销售部'; -- 先查:确认销售部有张三、王五2名员工
UPDATE staff
SET salary=salary*1.1, dept='营销部' -- 同时修改薪资和部门两个字段
WHERE dept='销售部'; -- 按部门筛选,批量修改符合条件的所有记录
-- 示例3:结合条件筛选的修改(多条件锁定范围)
-- 需求:给技术部、月薪低于7000元的员工,月薪加800元
SELECT * FROM staff WHERE dept='技术部' AND salary<7000; -- 先查:确认符合条件的员工(本例中无,可验证)
UPDATE staff
SET salary=salary+800
WHERE dept='技术部' AND salary<7000; -- 多条件筛选,进一步缩小修改范围
2. 进阶安全用法(ORDER BY + LIMIT,降低批量修改风险)
当需要批量修改数据,但不确定筛选条件的精准性时,可结合排序(ORDER BY)和限量(LIMIT),限定最大修改行数,避免误改过多数据,是生产环境批量修改的最佳实践。
UPDATE 表名
SET 字段=新值
[WHERE 筛选条件] -- 可选,进一步缩小范围
ORDER BY 排序字段 ASC/DESC -- 按指定字段排序,确定修改优先级
LIMIT 最大修改行数; -- 限定最多修改的行数,核心安全保障
连贯实操示例(基于staff表)
-- 需求:给全公司薪资最低的2名员工,月薪各加500元(避免误改过多员工)
-- 安全步骤:先查询薪资最低的2名员工,确认后再执行
SELECT * FROM staff ORDER BY salary ASC LIMIT 2; -- 先查:确认是赵六(4500)、王五(5500)
UPDATE staff
SET salary=salary+500
ORDER BY salary ASC -- 按薪资升序排序,优先修改薪资最低的员工
LIMIT 2; -- 最多修改2条,即使筛选条件有误,也不会影响更多数据
3. 核心避坑红线(必看,避免生产事故)
严禁无WHERE条件的全表更新:省略WHERE子句,会修改表中所有行的指定字段,比如
UPDATE staff SET salary=5000;会把所有员工薪资改为5000,生产环境绝对禁用;必须先查后改:执行UPDATE前,务必用相同的WHERE条件执行SELECT查询,确认修改范围和记录无误后,再执行更新,避免修改错误数据;
优先用主键筛选:主键(如staff_id)能唯一定位1条记录,是最安全的筛选条件,避免用非唯一字段(如dept、salary)作为唯一筛选条件,防止误改大量数据;
注意字段类型匹配:给字段赋值时,需与字段数据类型一致,比如给salary(INT类型)赋字符串值,会导致语句执行失败。
二、DELETE 数据删除(核心操作,详细拆解)
1. 核心语法&详细拆解(生产环境唯一推荐写法)
DELETE FROM 表名
WHERE 筛选条件; -- 安全核心,锁定要删除的记录范围,不可省略(除非特殊需求)
语法详细说明
DELETE FROM 表名:指定要删除数据的目标表,FROM关键字不可省略,否则语法错误;
WHERE 子句:筛选要删除的记录,核心作用是“锁定删除范围”,删除后的数据难以恢复,因此筛选条件必须精准;可结合主键、多条件筛选,确保删除正确记录。
连贯实操示例(基于staff表,覆盖不同场景)
-- 示例1:删除单条记录(精准删除,零风险)
-- 需求:删除员工编号4(赵六)的记录(假设赵六离职)
-- 安全操作步骤:先查询确认,再执行删除
SELECT * FROM staff WHERE staff_id=4; -- 先查:确认赵六的信息,避免删除错误员工
DELETE FROM staff
WHERE staff_id=4; -- 用主键筛选,精准锁定1条记录,无误删风险
-- 示例2:批量删除多条记录(按条件筛选)
-- 需求:删除2023年及之后入职的员工记录(假设该批次员工离职)
-- 安全操作步骤:先查询确认范围,再执行删除
SELECT * FROM staff WHERE entry_date >= '2023-01-01'; -- 先查:确认只有王五(2023-01-10)符合条件
DELETE FROM staff
WHERE entry_date >= '2023-01-01'; -- 按入职日期筛选,批量删除符合条件的记录
-- 示例3:多条件筛选删除(精准锁定目标记录)
-- 需求:删除营销部(原销售部)、月薪低于6000元的员工记录
SELECT * FROM staff WHERE dept='营销部' AND salary<6000; -- 先查:确认符合条件的记录
DELETE FROM staff
WHERE dept='营销部' AND salary<6000; -- 多条件筛选,避免误删其他部门员工
2. 进阶安全用法(ORDER BY + LIMIT,批量删除更安全)
批量删除数据时,结合排序和限量,既能控制删除行数,又能按业务需求确定删除优先级,避免误删全表,同时减少锁表风险(大量数据一次性删除会锁表,影响业务)。
DELETE FROM 表名
[WHERE 筛选条件] -- 可选,进一步缩小删除范围
ORDER BY 排序字段 ASC/DESC -- 按指定字段排序,确定删除优先级
LIMIT 最大删除行数; -- 限定最多删除的行数,控制风险
连贯实操示例(基于staff表)
-- 需求:删除入职时间最早的1名员工(假设老员工退休)
-- 安全步骤:先查询确认入职最早的员工,再执行删除
SELECT * FROM staff ORDER BY entry_date ASC LIMIT 1; -- 先查:确认是李四(2021-07-01)
DELETE FROM staff
ORDER BY entry_date ASC -- 按入职日期升序排序,优先删除入职最早的员工
LIMIT 1; -- 最多删除1条,即使筛选条件有误,损失也最小
-- 拓展:批量分批删除(适合大量数据删除)
-- 需求:删除营销部所有员工,分批删除(每次删1条,避免锁表)
-- 先查:SELECT * FROM staff WHERE dept='营销部';
DELETE FROM staff WHERE dept='营销部' LIMIT 1; -- 第一次删1条
-- 重复执行,直到删除完所有营销部员工(可结合循环,简化操作)
3. 核心避坑红线(必看,避免生产事故)
严禁无WHERE条件的全表删除:省略WHERE子句,会清空表中所有记录,比如
DELETE FROM staff;会删除所有员工数据,属于最高危操作,生产环境绝对禁用;必须先查后删:执行DELETE前,务必用相同的WHERE条件执行SELECT查询,确认删除范围和记录无误后,再执行删除,数据删除后恢复成本极高;
批量数据分批删:删除大量数据时,不要一次性删除所有符合条件的记录,用LIMIT分批执行(如每次删100条),避免长时间锁表,影响线上业务;
注意外键约束(补充):如果当前表的字段是其他表的外键(如staff_id是员工考勤表的外键),直接删除会报错,需先删除关联表的相关记录,再删除当前表记录。
三、全流程连贯实操总结(可直接复制执行验证)
-- 1. 建表并插入初始数据
CREATE TABLE staff (
staff_id INT PRIMARY KEY,
staff_name VARCHAR(20) NOT NULL,
dept VARCHAR(20),
salary INT,
entry_date DATE
);
INSERT INTO staff VALUES
(1, '张三', '销售部', 6000, '2022-03-15'),
(2, '李四', '技术部', 8000, '2021-07-01'),
(3, '王五', '销售部', 5500, '2023-01-10'),
(4, '赵六', '行政部', 4500, '2022-09-20');
-- 2. UPDATE操作(3个场景)
-- 2.1 精准修改单条记录
SELECT * FROM staff WHERE staff_id=1;
UPDATE staff SET salary=6500 WHERE staff_id=1;
-- 2.2 批量修改多字段
SELECT * FROM staff WHERE dept='销售部';
UPDATE staff SET salary=salary*1.1, dept='营销部' WHERE dept='销售部';
-- 2.3 进阶限量修改
SELECT * FROM staff ORDER BY salary ASC LIMIT 2;
UPDATE staff SET salary=salary+500 ORDER BY salary ASC LIMIT 2;
-- 3. DELETE操作(3个场景)
-- 3.1 精准删除单条记录
SELECT * FROM staff WHERE staff_id=4;
DELETE FROM staff WHERE staff_id=4;
-- 3.2 批量条件删除
SELECT * FROM staff WHERE entry_date >= '2023-01-01';
DELETE FROM staff WHERE entry_date >= '2023-01-01';
-- 3.3 进阶限量删除
SELECT * FROM staff ORDER BY entry_date ASC LIMIT 1;
DELETE FROM staff ORDER BY entry_date ASC LIMIT 1;
全程基于staff表,每个操作都遵循“先查后操作”的安全原则,覆盖日常开发中最常用的场景,既详细又不冗余,可直接用于学习和实操。