前言
我们在之前已经过了一遍sql的基本操作,那么那些基本操作如何使用、如何排列才能最大程度发挥服务器的性能呢?如何才能把他们连接起来成为能为我们所服务的强大数据库系统呢?
本期我们就将引入一些配合sql核心语句的使用技巧和一些灵活的理解
1.插入或替换
当我们需要插入一条记录,我们第一反应是用insert命令。但如果此时已经有相关记录了(如主键重复等)。这时候我们一般会采用先删除再添加的方法。但这样显然比较麻烦,我们可能还需要先查询是否已经存在记录了再决定是否需要删除再插入数据。
但如果我们引入replace语句,就可以简化我们的操作流程:
REPLACE INTO jueyou (id, user_id, nick, gender, score) VALUES (1, 775, '掘金酱', 'F', 99);
如上,我们尝试向jueyou数据表插入一条数据,此时replace会先判断id=1的记录是否存在,不存在的话会直接插入,存在的话会先删除原有记录再进行插入。
2.插入或更新
如果我们不希望原因数据直接被删除,我们可以考虑使用如下语句进行插入或更新操作:
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
比如还是上面的例子:
INSERT INTO jueyou (id, user_id, nick, gender, score) VALUES (1, 1, '掘金酱', 'F', 99) ON DUPLICATE KEY UPDATE name='掘金酱', gender='F', score=99;
具体要更新的数据即为update之后的数据。
3.插入或忽略
如果我们只是希望尝试插入一条数据,如果已经有相关数据存在,我们不用做任何的事,那便可以用到我们的insert ignore into...
语句。
我们仍然可以使用上面的例子来看看这个语句如何使用:
INSERT IGNORE INTO jueyou (id, user_id, nikc, gender, score) VALUES (1, 1, '小明', 'F', 99);
4.数据表快照
快照,即复制品。我们需要复制一份表的数据到一份新表,只需要使用create table 和 select 即可:
CREATE TABLE jueyou_copy SELECT * FROM jueyou WHERE gender="F";
以上命令即可将jueyou表中的所有性别为F(female女性)的数据复制到新的表jueyou_copy。也就是建立了一份名为jueyou_copy的快照,快照中储存的是jueyou中女性的数据
5.查询结果写入
我们可能经历了一通复杂的查询操作,用了不知道多少where字句。然后在查询完之后呢?我们只是看一看或者拿脑子来记忆吗?
当然不是,我们可以把查询结果储存到我们的数据表中结合insert和select即可
比较典型的案例就是:已经有了一个班级的成绩数据grade,我们需要计算并插入这个班级的平均成绩:
CREATE TABLE AVGgrade ( id BIGINT NOT NULL AUTO_INCREMENT, class_id BIGINT NOT NULL, average DOUBLE NOT NULL, PRIMARY KEY (id) );
如上,假设我们以这样的方式创建一个数据表。表名为grade,拥有自动标号的数值型id,不能为空的数值型class_id,不能为空的浮点数类型double,并在最后把id设置为主键。这个表用来存储我们最后的平均成绩
如果此时我们已经有一个表为grade,里面存了class_id和的每次考试的score,那么我们就可以用一个语句完成平均成绩的计算与存储:
INSERT INTO AVGgrade (class_id, average) SELECT class_id, AVG(score) FROM grade GROUP BY class_id;
在select语句中我们使用了之前遇到过的groupby,按照classid分类后求平均值,最后存入AVGgrade表。
小结
今天这篇文章我们主要了解并实战了5项实用技巧。分别是
插入替换
插入更新
插入忽略
快照
查找储存
希望路过的朋友都能有所收获~ 跑码丝滑~