--- title: "08-数据删除(删)" created: 2025-11-25 tags: - 项目筑基 --- # 数据删除(删) 删除记录用 DELETE 其他用DROP ### 删除表中全部数据 ```sql DELETE 表名 ``` ### 删一些特定数据 用where条件 ```sql DELETE 表名 WHERE 【LEN(学院电话)<8】…… ``` ![[image-59f265cb.png]] ### 原理 delete做的事情是一个一个抹去数据 效率比较低 但空间仍存在没被释放 这样就意味着可以反悔 删除的东西可以回滚操作恢复(rollback) 可以理解为逻辑删除 那么有没有物理删除 删干净那种(删库跑路) ### truncate 效率很高 表被一次截断 物理删除 无法回滚 (哪有缺点 都是优点doge) ```sql truncate table 表名 ``` truncate属于DDL操作 delete属于DML操作 正经的 如果要删除很大的一个表 delete效率太低 可能要执行好几个小时 但truncate只需要几秒 这不是删表 只是删数据 表结构仍在 删表是drop table truncate只能删全部数据 单条某些条还是用delete ### 补充:三兄弟对比 DELETE TRUNCATE DROP 容易混 拉个表一次说清 | | DELETE | TRUNCATE | DROP | | --- | --- | --- | --- | | 删什么 | 数据 可带where挑着删 | 全部数据 一刀切 | 整张表连结构带数据 | | 类型 | DML | DDL | DDL | | 能否回滚 | 能 | 不能 | 不能 | | 自增计数 | 不归零 | 归零 从头再来 | 表都没了谈不上 | 一句话 delete删内容 truncate删光内容 drop直接掀桌 ### 补充:删排序后的前几条 MySQL里delete还能配order by和limit 比如清掉成绩最低的10条 ```sql DELETE FROM 选课成绩 ORDER BY 成绩 ASC LIMIT 10 ``` 先按成绩升序排 再从头删10条 不用先查出来再一条条delete ### 补充:超大表删除的换表大法 上面说了delete删大表可能要好几个小时 truncate又只能一刀全删 万一需求是"旧数据不要了 但马上要建张同名新表接着干活" 可以换表 ```sql RENAME TABLE 大表 TO 大表_旧; CREATE TABLE 大表(……); --结构和原来一样 瞬间建好 ``` 业务无缝衔接 旧表在后台慢慢truncate或者哪天心情好直接drop掉 --- ⬅️ [[07-数据插入(增)|07-数据插入(增)]] 🏠 [[00-数据库|00-数据库]] ➡️ [[09-数据修改(改)|09-数据修改(改)]]