插入或者替换
如果我们需要插入一条新的记录,如果记录已经存在,就先删除原纪录,再插入新纪录,此时可以使用replace语句,这样就不必先查询再决定是不是删除再插入。根据主键id判断
-- 插入或者替换 --
replace into `students` (id,class_id,name,gender,score) values(1,1,'小明','F',99);
插入或者更新
如果我们希望插入一条新记录,但如果记录已经存在,就更新该记录,此时可以使用
insert into ... on duplicate key update ...语句,
insert 表示插入新的记录,update 表示要更新的字段。
-- 插入或更新 --
insert into `students` (id,name,class_id,gender,score) values (1,'小明',1,'F',90) on duplicate key update name='小明',gender='F',score=90,class_id=1;
注意哦,后面跟的update语句不需要使用set进行更新字段值,只需要 字段名='字段值'。并且是不是要插入或者更新,是按照唯一标识的主键来判断的
插入或忽略
如果我们希望插入一条新纪录,但是如果记录已经存在的话,就什么都不做,直接忽略,可以使用
insert ignore into..语句。
-- 插入或忽略 --
insert ignore into students (id,class_id,name,gender,score) values (1,1,'小明','F',99);
根据主键id判断。
快照
就是将当前表中存在的记录数复制一份到一个新的表中,可以结合create table 和 select
-- 对符合查询条件的某些记录进行快照 --
create table students_class1 select * from `students` where class_id = 1;
新创建的表的结构和select的表的结构完全一致。
写入查询结果集
就是说我们将符合查询条件的记录查询出来后直接插入到我们指定的表中。使用insert 和 select 来书写,只不过值是我们查询出来的。
-- 写入查询结果集 --
insert into `statistics` (class_id,average) select class_id,avg(score) from `students` group by class_id;
将students表中的班级列和平均分字段根据班级进行分组之后,写入到statistics表中去,需要注意的是statistics表中的列要和select语句中的列要保持一一对应。(说到底还是聚合查询嘛,如果写了其他的列,那么一行之内存不下这么多的记录,自然会报语法错误);
强制使用索引
在进行查询的时候,数据库系统会自动的分析查询语句,并选择一个最合适的索引,但是系统的查询优化器并不一定总是能使用最优的索引,所以就需要我们指定要使用的索引。force index 就是强制使用指定的索引进行查询。
-- 强制使用指定的索引 --
select * from `students` force index (index_class_id) where class_id = 1 order by id desc;
必须要加()标注起来。顺便复习一下怎么为表中某些列添加索引。