数据的插入、删除和更新

上集回顾

上集中介绍了让人眼花缭乱的查询方式,包括简单查询、子查询、链接查询、组合查询以及各种查询细节,可别忘了表里先得有数据,才能后查询才能有意义啊!之前我们只是简单介绍了数据的插入语句,本集中我们将详细唠叨各种对表中数据的操作,包括插入数据、删除数据和更新数据。

准备工作

本集中要唠叨的是对表中数据的操作,首先需要确定用哪个表来演示这些操作,本着勤俭节约的精神,我们还是复用之前用过的表,只不过这个表快被玩坏了,我们把它删掉重建一个,一切重新开始:

对于表来说,我们保留了两个列,一个是类型的列,另一个是类型的列。

插入数据

在关系型数据库中,数据一般都是以(或者说)为单位被插入到表中的,具体的插入形式且看我们慢慢道来。

插入完整的记录

在插入完整的一条记录时,需要我们指定要插入表的名称和该条记录中全部列的具体数据,完整的语法是这样:

比如里有两个列,分别是和,如果我们想要插入完整的记录的话,中必须依次填入列和列的值,比如这样:

可以看到执行结果是,表明成功的插入了一行。然后再用语句看看表中的数据:

现在的中就有了一条记录了。在使用这种插入一条完整记录的语法时必须注意,VALUES语句中必须给出表中所有列的值,缺一个都不行,如果某个列我们不知道填什么值,可以使用填入值(前提是该列没有声明属性),就像这样:

值得注意的是,虽然这种数据插入语法很简单,但是并不鼓励使用,因为这种插入语法VALUES列表中的值高度依赖表中列的顺序,也就是说一旦表的结构改变,比方把和列的顺序换一下,这种插入语句就不适用了。所以我们可以在书写插入语句的时候就把列的顺序规定好,就像这样:

在这个语句中,我们显式的指定了列的插入顺序是,对应于列表中的值的顺序,也就是说与值对应,与值对应。之后即使表中列的结构改变了,这个语句仍然能继续使用。我们也可以随意指定列的插入顺序,比如这样:

我们把放在了之前,所以列表中的值也需要改变顺序,来看一下插入效果:

插入记录的一部分

我们在插入数据的时候,某些列的值可以被省略,但是这个列必须满足下边列出的某个条件之一:

该列允许存储NULL值

该列有DEFAULT属性,给出了默认值

我们定义的表中的两个字段都允许存放值,所以在插入数据的时候可以省略部分列的值。没有显式指定的列的值将被设置为,意思是还没有指定值,比如这样写:

第一条插入语句我们只指定了列的值是,而没有指定的值,所以的值就是;第二条插入语句我们只指定了的值是,而没有指定的值,所以的值就是,也表示没有数据~ 看一下现在表中的数据:

在使用这种方式插入数据时需要注意,指定的列顺序可以改变,但是一定要和列表中的值一一对应起来。其实如果把所有列都给出来的话,其实就相当于插入完整的记录了。

批量插入记录

每插入一条记录写一条语句也不是不行,但是对人来说太烦了,而且每插入一行数据提交一个请求给服务器远没有一次把所有插入的数据提交给服务器效率高,所以为我们提供了批量插入的语句,就是直接在后多加几组值,每组值用小括号扩起来并用逗号分隔就好了,就像这样:

我们在这个插入语句中插入了、这么两条记录,直接把它们放到后边用逗号分开就好了,我们看一下插入效果:

将某个查询结果集插入表中

上边的插入语句都是我们显式的将记录的值放在后边,其实我们也可以将某个查询结果作为数据源插入到表中。我们先新建一个表:

这个表有两个列,一个是类型的列,另一个是类型的列。现在这个表中是没有数据的,我们想把表中的一些数据插入到表的话可以这么写:

这条语句可以分成两条语句理解:

先执行查询语句。

这条语句的结果集是

把查询语句得到的结果集插入到指定的表中。

把第1步中的到的结果集中的记录批量插入到表中,得到的结果就是:

在将某个查询的结果集插入到表中时需要注意,INSERT语句指定的列要和查询列表中的列一一对应。比方说上边的INSERT语句指定的列是,对应于查询语句中的。

插入或忽略

对于一些是主键或者具有唯一性约束的列或者列组合来说,它们不允许重复值的出现,比如我们把的列添加一个唯一性约束:

因为有了唯一性约束,所以如果插入的数据中列的值与已有的值重复的话就会报错,比如这样:

我们在插入数据的时候又不知道表里有没有重复的记录,所以我们现在想要一个这样的效果:如果表中没有重复的记录,则插入,如果表中有重复的记录,则忽略本次插入。给我们提供了的语法来实现这个功能:

我们只是简单的在后边加了个单词便不再报错了!对于批量插入的情况,同样使用,它会把在具有唯一性约束列上没有重复的记录成功插入,把有重复记录的忽略,比如这样:

这个批量插入的语句中我们想插入和这两条记录,因为列值为的记录已经在表中存在,所以这个记录会被忽略,而这条记录被插入成功,看插入效果:

插入或更新

对于主键或者有唯一性约束的列或列组合来说,新插入的记录如果和表中已有的记录重复的话,我们可以选择的策略不仅仅是忽略这次插入,我们也可以选择更新这条重复的记录。比如我们想在表中插入一条记录,内容是,我们想要的效果是:如果表中没有重复的记录,则插入,如果表中有重复的记录,则按照规定更新这些重复记录中某些列的值。MySQL给我们提供了的语法来实现这个功能:

这个语句的意思就是,对于要插入的数据来说,如果表中有某些重复的记录,那就把记录的列更新为,看一下效果:

如果我们在遇到记录后想更新的值就是准备插入的记录中的值,比如这样:

我们想插入的记录的列的值是,如果有重复记录后对列想更新的值也是,那我们可以用的形式来替代显式把值写出来的形式(与上边语句达成一样效果):

就代表着要准备插入的记录中的值,本例中就是。这种形式在批量插入或更新中更重要:

我们准备批量插入两条记录和,在遇到重复记录时把该重复记录的列更新成准备插入的记录中的值就好了,所以效果是这样:

删除数据

如果某些记录我们不想要了,可以删掉的,语法就是这样:

我们把中的值大于的记录都删掉看看:

其中的表名成功的删除了4条记录,然后看一下删除效果:

大于的记录就都不见了哈~ 当然删除语句的子句是可选的,如果不加子句的话,意味着删除表中所有数据,比如我们想清除表中的所有数据,可以这么写:

不过在使用删除语句需要特别特别注意:记录被删除之后就非常难恢复了,所以使用删除语句时需要十分慎重!另外,虽然删除语句的WHERE条件是可选的,但是如果不加WHERE条件的话将删除所有的记录,这是玩火的行为!超级危险!十分危险!请慎重使用。

更新数据

有时候对于某些记录的某些列的值不满意,我们可以去修改它们,我们需要指定更改哪张表中的哪些记录以及具体的修改内容,语法就是这样:

凡是满足的行都会被更新,你想更新哪些列的值,就把它们写到单词后边,如果想更新多个列的话,它们之间用逗号分隔开。比如我们把表中的值是的记录的的值更新为,的值更新为,可以这么写:

就表明成功更新了1行数据。表示符合条件的记录一共有1条,表示有1条记录的内容发生了变化。我们看一下修改后的效果:

在使用更新语句也需要特别特别注意:虽然更新语句的WHERE条件是可选的,但是如果不加WHERE条件的话将更新所有的记录,这是玩火的行为!超级危险!十分危险!请慎重使用。

总结

使用语句来向表中插入数据,可以使用这两种方式:

不指定需要插入数据的列:

这种方式高度依赖表中列的顺序,不推荐使用。

显式指定需要插入数据的列

推荐使用这种方式进行插入,在表结构允许的情况下还可以只对部分列进行插入。

直接在后多加几组值,每组值用小括号()扩起来并用逗号分隔就好了就是批量插入语句。

对于主键或者有唯一性约束的列或列组合来说,新插入的记录如果和表中已有的记录重复的话,我们可以选择下边这两种插入策略:

插入或忽略

使用语法,如果表中没有重复的记录,则插入,如果表中有重复的记录,则忽略本次插入。

插入或更新

使用语法,如果表中没有重复的记录,则插入,如果表中有重复的记录,则按照规定更新这些重复记录中某些列的值。

删除记录的语法很简单:

更新记录的语法也很简单:

如果你通过文章有所收获,能把文章中的知识用到自己的工作学习中,提升自己的工作效率以及相应的薪资,那请点击喜欢作者,码字不易,谢谢~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180628G026UZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券