数据的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
相关推荐
snow@li7 小时前
数据库:市场中都有哪些数据库 / 优缺点 使用情况
数据库
NoSi EFUL8 小时前
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
android·数据库·mysql
河阿里8 小时前
SQL数据库:五大范式(NF)
数据库·sql·oracle
l1t9 小时前
DeepSeek总结的PostgreSQL 19查询提示功能
数据库·postgresql
chenxu98b10 小时前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql
刘晨鑫111 小时前
MongoDB数据库应用
数据库·mongodb
梦想的颜色11 小时前
mongoTemplate + Java 增删改查基础介绍
数据结构·数据库·mysql
小小小米粒12 小时前
redis命令集合
数据库·redis·缓存
herinspace12 小时前
管家婆实用贴-如何分离和附加数据库
开发语言·前端·javascript·数据库·语音识别
步辞13 小时前
Go语言怎么用channel做信号通知_Go语言channel信号模式教程【完整】
jvm·数据库·python