数据的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
相关推荐
蓝田~4 小时前
MySQL慢查询怎么优化?B+Tree索引原理+MVCC读不阻塞写+EXPLAIN执行计划,从5秒到0.05秒
数据库·mysql
sunxunyong5 小时前
doris用户资源组配置
数据库
Cloud云卷云舒5 小时前
云卷云舒:HaishanDB的AI原生能力主要应用场景
数据库·人工智能·ai-native·haishandb·移动云长期记忆
时间的拾荒人5 小时前
MySQL 视图详解
android·数据库·mysql
qq_366086225 小时前
sql 查询中关于 null 值判断的问题
数据库·sql
测试修炼手册5 小时前
[测试技术] JUnit 6 入门与实战:断言、参数化与 Mockito
数据库·junit·sqlserver
吴声子夜歌6 小时前
Redis 3.x——集群故障转移
java·数据库·redis·集群
名不经传的养虾人6 小时前
从0到1:企业级AI项目迭代日记 Vol.71|系统显示正常,但实际上什么都没发生
数据库·人工智能·ai编程·ai工作流·企业ai
尽兴-6 小时前
企业数据库选型与演进:Oracle、达梦、MySQL 与分库分表实践
数据库·mysql·oracle·分库分表
空中湖7 小时前
Spring AI Function Calling 完全指南:让 AI 查数据库、调 API、发通知
数据库·人工智能·spring