数据库运维
记录DBA学习成长历程

MySQL的DML数据操作语言

已知创建的表定义如下

use school;
create table stu(
id int not null primary key auto_increment comment '学号',
name varchar(255) not null comment '姓名',
sage tinyint unsigned not null default 0 comment '年龄',
sgender enum('m','f','n') not null default 'n' comment '性别',
sfz char(18) not null unique comment '身份证',
intime timestamp not null default now() comment '入学时间'
)engine=innodb charset=utf8 comment '学生表';

DML数据操作语言作用

对表中的的数据行(记录)进行增删改

insert数据行插入语句

大批量数据录入,需要选择业务不繁忙的时候录入,分批录入

最标准的insert语句插入方法

desc stu;
insert into stu(id,name,sage,sg,sfz,intime)
values
(1,'zs',18,'m','123456',now());

省事的写法

insert into stu
values
(2,'ls',18,'m','1234567',now());

针对性的录入数据

insert into stu(name,sfz)
values
('w5', '3423432');

同时录入多行数据

insert into stu(name,sfz)
values
('w55','32432433'),
('m6','4335434'),
('aa','993332');
select * from stu; 查看数据行是否插入成功

update数据行修改

desc stu;
select * from stu;
update stu set name='zhao4' where id=2;修改id=2的数据行name为zhao4
注意:update语句必须要加where条件对要修改的行添加唯一条件值

delete数据行删除

delete from stu where id=3;会对表中的id=3的数据行进行删除
全表删除
delete from stu;会对表中的数据行逐行删除
truncate table stu;
drop table stu;

区别

delete:DML删除,逻辑删除,逐行进行删除,数据行多的情况下速度慢。不会释放之前申请的段区页物理空间,之前占用的磁盘空间还是会存在,只是数据行被标记为覆盖状态,
看不见数据而已。HWM高水位线不会降低。delete使用过多磁盘碎片增多会浪费大量的磁盘空间。尤其是在做全表扫描和>范围查询时会有性能影响。
truncate:DDL操作,物理删除,速度快。清空表段中的数据页,也就是清空了ibd文件,期盼空间立即释放,HWM高水位线会降低,但是表的定义还在,即是frm还在。
drop table stu;物理删除,将表结构(元数据)删除,清空表段中的数据页,并且把表的定义删除。

处理磁盘逻辑碎片

把表mysqldump逻辑备份导出,然后把表truncate掉,然后再导入新表。或者更高效的使用内置命令处理碎片。

delete实际应用

删除评论,删除用户,注销用户

update伪删除

作用

用update代替delete,保证应用查select不到这个想要删除的数据即可,规避误删除操作

设置方法

需求:设置状态列,1为存在,0为不存在
1.添加状态列
alter table stu add state tinyint not null default 1;
select * from stu;
2.update替代delete
update stu set state=0 where id =6;
3.业务语句查询
select * from stu where state=1;
赞(2)
MySQL学习笔记 » MySQL的DML数据操作语言