已知创建的表定义如下
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;