数据的DML语句

insert

复制代码
-- 插入完整数据
INSERT INTO emp (id, workno, name, gender, age, idcard, entrydate, username)
VALUES (2, '002', '李四', '女', 22, '110101200102024321', '2024-02-01', 'lisi');

-- 插入部分数据
INSERT INTO emp (name, age, gender)
VALUES ('王五', 30, '男');

-- 批量插入
INSERT INTO emp (name, age)
VALUES ('赵六', 27),
       ('钱七', 24);

update

UPDATE 用于修改表中已存在的数据,是核心的写操作之一,使用时要格外谨慎!

1. 基础语法(最常用)

① 标准完整写法

复制代码
UPDATE 表名 
SET 字段1 = 新值1, 字段2 = 新值2, ...
[WHERE 条件];
  • SET:指定要修改的字段和新值,多个字段用逗号分隔。

  • WHERE :可选,但强烈建议必须加 ,否则会修改表中所有行

  • 示例(修改 emp 表中张三的年龄和用户名):

    UPDATE emp
    SET age = 26, username = 'zhangsan_new'
    WHERE name = '张三';

② 不加 WHERE 的风险(⚠️ 极度危险)

复制代码
-- 错误示范:会把整张表的 age 都改成 30!
UPDATE emp
SET age = 30;

这种操作会导致全表数据被覆盖,生产环境中是严重事故!

2. 高级用法

① 基于其他字段计算更新

可以在 SET 中使用表达式,基于现有字段计算新值:

复制代码
-- 1. 修改单条数据(推荐)
UPDATE emp
SET workno = '001_new', gender = '男'
WHERE id = 1;

-- 2. 批量修改符合条件的数据
UPDATE emp
SET entrydate = '2024-01-01'
WHERE entrydate IS NULL;

-- 3. 基于表达式更新
UPDATE emp
SET age = age + 1
WHERE gender = '女';

② 多条件筛选更新

WHERE 子句可以用 AND/OR 组合多个条件,精准定位要修改的行:

复制代码
-- 修改性别为女、年龄小于25的员工的入职日期
UPDATE emp
SET entrydate = '2024-03-01'
WHERE gender = '女' AND age < 25;

③ 结合子查询更新(进阶)

可以用子查询的结果作为新值:

复制代码
-- 将工号为001的员工的入职日期,改为和工号002的员工相同
UPDATE emp
SET entrydate = (SELECT entrydate FROM emp WHERE workno = '002')
WHERE workno = '001';

3. 常见问题与注意事项

🔴 常见错误

  1. 忘记加 WHERE 条件

    • 后果:全表数据被修改,无法恢复(除非有备份或事务回滚)。
  2. 字段与值类型不匹配

    复制代码
    -- 错误:age 是数字类型,却赋值字符串
    UPDATE emp SET age = '二十六' WHERE name = '张三';
  3. 条件过于宽泛

    • 比如 WHERE name LIKE '张%',可能会修改多条你不想改的数据。
  4. 先查后改 :执行 UPDATE 前,先用 SELECT 验证 WHERE 条件筛选的行是否正确

🟢 安全操作技巧

复制代码
-- 先确认要修改的行
SELECT * FROM emp WHERE name = '张三';
-- 确认无误后再执行 UPDATE

使用事务(InnoDB 引擎支持):在事务中执行 UPDATE,发现错误可以回滚:

BEGIN;
UPDATE emp SET age = 26 WHERE name = '张三';
-- 检查结果后,确认无误再提交
COMMIT;
-- 出错则回滚
ROLLBACK;

4. 完整示例(基于你的 emp 表)

复制代码
-- 1. 修改单条数据(推荐)
UPDATE emp
SET workno = '001_new', gender = '男'
WHERE id = 1;

-- 2. 批量修改符合条件的数据
UPDATE emp
SET entrydate = '2024-01-01'
WHERE entrydate IS NULL;

-- 3. 基于表达式更新
UPDATE emp
SET age = age + 1
WHERE gender = '女';

5. 与 INSERT/DELETE 的对比

操作 作用 能否回滚 风险等级
INSERT 新增数据 可以
UPDATE 修改数据 可以 中(不加 WHERE 则极高)
DELETE 删除数据 可以

delete

1、DELETE FROM 表名 WHERE 条件;

复制代码
-- 删除 id=1 的这条数据
DELETE FROM emp WHERE id = 1;

-- 删除年龄大于 60 的所有人
DELETE FROM emp WHERE age > 60;

-- 不加 WHERE → 删除表中所有数据!
DELETE FROM emp;

TRUNCATE TABLE 表名;

2、作用

一次性清空整个表的所有数据,表还在,数据全没。

复制代码
TRUNCATE TABLE emp;

3、DELETE 和 TRUNCATE 的区别(必背)

特点 DELETE FROM 表 TRUNCATE TABLE 表
删除范围 可删指定行 只能清空全表
能否加 WHERE 可以 不可以
速度 较慢 极快
自增 ID 不会重置 会重置从 1 开始
是否可回滚 可以(事务里) 一般不可回滚

4、 最简单记忆

  • 想删某几条数据 → 用 DELETE ... WHERE ...
  • 想清空整个表、从头再来 → 用 TRUNCATE TABLE
相关推荐
小陈工2 小时前
Python Web开发入门(九):权限管理与角色控制实战
服务器·开发语言·前端·数据库·python·安全·sqlite
王权富贵-2 小时前
100% 兼容 PostgreSQL:PolarDB V2.0 让数据库迁移像“搬家”一样简单
数据库·阿里云·国产数据库·国产自研数据库
小陈工2 小时前
2026年4月3日技术资讯洞察:微服务理性回归、AI代码生成争议与开源安全新挑战
开发语言·数据库·人工智能·python·安全·微服务·回归
遇见你...2 小时前
A02 Spring-IOC和DI注解开发
数据库·spring·sqlserver
okiseethenwhat2 小时前
MySQL一个简单概念:索引下推和索引查询流程
数据库
本体智能2 小时前
从“查数”到“懂数”:本体语义层让数据分析真正智能化
数据库·数据挖掘·数据分析
爬山算法2 小时前
MongoDB(71)如何启用MongoDB身份验证?
数据库·mongodb·oracle
蚂蚁数据AntData2 小时前
DB-GPT V0.8.0 版本更新|范式跃迁:AI + Data 驱动的数据分析交互体验升级
大数据·数据库·人工智能·数据分析·开源
云边有个稻草人2 小时前
【MySQL】第十五节—事务隔离级别与 MVCC 机制深度解析
数据库·mysql事务·可重复读·模拟mvcc·如何理解隔离性·串行化·undo 日志