数据的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
相关推荐
lsylalalala3 分钟前
mysql-索引1
数据库·mysql
叶 落12 分钟前
Ubuntu24 安装 PostgreSQL
数据库·postgresql·安装教程
HAYDENR21 分钟前
依赖数据迁移工具做增量同步有哪些易错点?调整数据迁移工具策略怎么保证断点续传可靠?
java·大数据·数据库
邀星月为媒24 分钟前
高阶加餐 08|Prompt 故障定位与可观测性:模型突然变差时,别再靠“重新写一遍 Prompt”解决
服务器·数据库·prompt
2501_937860943 小时前
MySQL表的操作:创建、查看、修改、删除完整实战
android·数据库·mysql
奇特認7 小时前
mysql 集群技术 3.高可用之 MHA
数据库·mysql
Bioinfo Guy9 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来
数据库·生物信息学·生信可视化
ltl11 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式
数据库
Blossom i13 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
雾时之林13 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库