导出数据
将检索到的数据,保存到服务器的文件内。
通过:select * into outfile '文件地址' from xxx;
select * from teacher_grade; select * into outfile 'd:/testmysql/result' from teacher_grade;
注意:
可以自动创建文件,但是不能重写已有文件。
生成的文件格式:默认的采用行来区分记录,制表符区分字段。
为了满足某种特别的需求,会采用不同的分割方式。支持在导出数据时,设置记录与字段的分隔符。
通过如下的选项:
fields:设置字段选项
lines:设置行选项(记录选项)
默认值:
字段:fields terminated by '/t' enclosed by '' escaped by '//'
记录:lines terminated by '/n' starting by ''
也可以根据实际情况自己设定。
select * into outfile 'd:/testmysql/result' fields terminated by '/t' enclosed by '*' lines terminated by '/n' starting by 'start:' from teacher_grade;
注意:
常规的所有的记录,应该通过行来显示。
但是也有例外,例如保存二进制数据:Blob binary使用into dumpfile
select * into dumpfile 'd:/testmysql/resultbin' from teacher_grade limit 1; select * into outfile 'd:/testmysql/result' from teacher_grade limit 1;
增加数据
insert into tbl_name (字段列表) values (值列表)
可以不将所有的字段都插入数据。
如果说需要完成部分字段的插入,需要必须存在字段列表。
没有插入部分字段,可以使用下面的set语句。
insert into teacher_grade (name) values ('黄继光'); insert into teacher_grade set name='黄继光'; insert into teacher_grade set t_name='张三丰',c_name='太极拳'; insert into teacher_grade (t_name,c_name) values ('黄继光','射击'),('黄飞鸿','飞毛腿');
插入数据时,如果主键冲突会如何?
默认有主键约束,不会插入成功;
但是可以在insert语法内,可以进行控制。
在主键冲突时,改成执行更新操作。
insert into teacher_grade (id,t_name,c_name) values (13,'张无忌','太极拳') on duplicate key update t_name='张无忌',c_name='太极拳';
注意:这里update后面不跟set。
流程:
先判断是否插入成功?
如果失败(主键冲突|唯一索引冲突),则进行更新操作。
插入(失败) 更新 更新完毕
插入数据源:
除了使用自定义的数据外,还可以使用select语句查询到数据,作为插入的数据源。
insert into teacher_grade (t_name,c_name) select t_name,c_name from teacher_grade;
数据可以来源于其他数据表,要求字段数量和类型一致即可。
insert into teacher_grade (t_name,c_name) select t_name,class_name from teacher;
通过强制使用default关键字或者default()函数使用默认值。
alter table teacher modify days tinyint(3) unsigned default 10; insert into teacher values (10,'xxx','yyy',default), (11,'xxx','yyy',default(days));
replace
主键或唯一索引冲突,则替换,否则插入。
insert into teacher values(1,'老子','儒家',30);
如果插入冲突,先删除旧记录,再插入新纪录。
replace into teacher values(1,'老子','儒家',30);
主键不冲突,直接插入。
replace into teacher values(15,'老子','儒家',30);
导入select * into outfile 'file'命令导出的内容
load data infile 'file' into table tbl_name;
注意:
导入时,涉及到数据增加,需要考虑是否冲突的情况。
通常可以在导出时,将主键导出成null。在导入时,利用自动增长的特性,可以形成新的主键。
select null,t_name,class_name,days from teacher;
desc teacher; alter table teacher modify t_id int auto_increment; alter table teacher drop primary key; alter table teacher modify t_id int primary key auto_increment;
load data infile 'd:/testmysql/result' into table teacher;
删除数据
允许使用条件:删除符合条件的数据。
允许使用limit:限制删除的记录数,limit n;
常见场景:
limit配合order by来使用。(先将结果排序,再删除固定数量的记录数。)
delete from teacher order by days limit 10;
如果只有order by是没有意义的。
允许连接删除
允许使用类似的join语法,同时删除多个表内的记录。
create table one( one_id int, one_data char, public_field int ); create table two( two_id int, two_data char, public_field int ); insert into one values(1,'a',10); insert into one values(2,'b',20); insert into one values(3,'c',30); insert into two values(2,'b',20); insert into two values(3,'c',30); insert into two values(4,'d',40); select * from one; select * from two;
select * from one join two using(public_field);
先提供表名,再提供连接条件。
delete from one,two using one join two on one.public_field=two.public_field where one_id=2;
如果不使用连接,则需要分别删除。
delete one
delete two
删除表所有数据
delete from test;
清空表
truncate teacher;
重建自定增长的主键,不会返回删除的记录数。
delete与truncate的区别
delete:逐行删除。
truncate:删除表,新建表。
更新数据
replace
insert onduplicate key update
条件更新,排序更新,限制条数
update ... where ... order by ... limit ...
多表更新
update one join two on one.public_field = two.public_field set one_data='x',two_data= 'y' where one_id=3;