mysql系列——DML数据操作语言(三)
一、DML定义
DML:(Data Manipulation Language)数据操作语言-数据库的基本操作,SQL中处理数据等操作统称为数据操纵语言,简而言之就是实现了基本的“增删改查”操作。
DML操作是可以手动控制事务的开启、提交和回滚的。包括的关键字有:select、update、delete、insert、merge
声明:本文涉及到的语法用 [] 包含的内容,属于可选项。
一、插入操作
1、插入单行两种方式
方式1:
1 | insert into 表名[(字段名 1 ,字段名 1 ,…)] values(值 1 ,值 2 ,…); |
说明:
- 字段和值的个数、类型必须一一对应
- 如果是字符类型或日期类型,值需要用单引号(‘’)引起来;
- 如果是数值类型,不需要用单引号;
- 如果字段不能为空,必须插入值;
- 可以为空的字段可以不用插入值,但需要注意:字段和值都不写;或字段写上,值用null代替;
- 如果表名后不写字段,此时表示所有字段,顺序和表中字段顺序一致。
方式2: 不常用
1 | insert into 表名 set 字段 1 =值 1 ,字段 2 =值 2 ,..; |
2、批量插入两种方式
方式1
1 | insert into 表名[(字段 1 ,字段 2 ,…)] values(值 1 ,值 2 ,…), (值 1 ,值 2 ,…), (值 1 ,值 2 ,…)…; |
方式2
1 | insert into 表名[(字段 1 ,字段 2 ,…)] |
说明:
数据来源select语句可以有很多种写法,需要注意:select返回的结果和待插入数据的字段的数量、顺序以及类型需要完全一致。
二、更新操作
1、单表更新
1 | update 表名[[as] 别名] set [别名.]字段 = 值, [别名.]字段 = 值…[where条件]; |
2、多表更新
1 | update 表 1 [[as] 别名 1 ], 表 2 [[as] 别名 2 ] set [别名.]字段 = 值, [别名.]字段 = 值…[where条件]; |
3.一张表的数据更新到另一张表
UPDATE t_agreement_record a, t_project_report_info_rel r SET a.project_id = r.project_id WHERE a.project_name= r.project_name;
三、删除操作
1、使用delete删除
单表删除
1 | delete [别名/表名] from 表名[[as] 别名] [where条件]; |
注意:
- 如果无别名,表名就是别名;
- 如果有别名,delete后面必须写别名;
- 如果无别名,delete后面的别名可省略。
1 2 3 4 5 6 7 8 | --删除demo1表所有记录 delete from demo1; --删除demo1表所有记录 delete demo1 from demo1; --有别名的方式,删除demo1表所有记录 delete d1 from demo1 d1; --有别名的方式,删除demo1表满足条件的记录 delete d1 from demo1 as d1 where d1.a > 100 ; |
多表删除
1 | delete [别名 1 ], [别名 2 ]… from 表 1 [[as] 别名 1 ], 表 2 [[as] 别名 2 ]… [where条件]; |
说明:别名可以省略不写,但是需要在delete后面跟上表名,多个表名之间用逗号隔开。
示例1:
1 2 | 删除demo1表中的记录,,条件是这些记录的字段a在demo2中存在的记录。 delete d1 from demo1 t1,demo2 d2 where d1.a = d2.c2; |
示例2:
1 2 | 同时对 2 个表进行删除,条件是demo1.a=demo2.c2的记录。 delete d1,d2 from demo1 d1,demo2 d2 where d1.a=d2.c2; |
2、使用truncate删除
1 | truncate 表名; |
3、drop、truncate、delete区别
drop 表名
1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
truncate table 表名
1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、truncate只删除数据,而不删除表的结构(定义)。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小
3、对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。
delete from 表名
1、delete是DML,执行delete操作时,每次从表中删除一行,同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,
但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
2、delete只删除数据,而不删除表的结构(定义)。delete操作不会减少表或索引所占用的空间。
3、指定where子句,支持删除部分数据。
总结:
1、在速度上,一般来说,drop> truncate > delete。
2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
3、如果想删除表,当然用drop;
如果想保留表而将所有数据删除,并且和事务无关,用truncate即可;
如果和事务有关,或者想触发trigger,还是用delete;
如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南