4.1.3 插入表数据
在创建了数据库及数据表后,下一步就是向表里插入数据。通过insert语句可以向表中插入一行或多行数据。可以插入的方式有:插入完整的记录、插入记录的一部分、插入多条记录、插入另一个查询的结果,下面将分别介绍这些内容。
1.为表的所有字段插入数据
使用基本的insert语句插入数据要求指定表名称和插入新记录中的值。基本语法格式为:
“表名”指定要插入数据的表名称,“字段名列表”指定要插入数据的哪些列,“值列表”指定每个列应对应插入的数据。注意,使用该语句时,字段列和数据值的数量必须相同。
【例4.1】向员工管理信息系统empMIS数据库中的departments表插入一条记录。
插入数据SQL语句如下:
执行插入操作之前,使用select语句查看表中的数据:
结果显示当前表为空,没有数据,接下来执行插入操作:
语句执行完毕,查看执行结果:
可以看到插入记录成功。在插入数据时,指定了departments表的所有字段,因此将为每一个字段插入新的值。
insert语句后面的字段名称顺序可以不是departments表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以,如例4.2所示。
【例4.2】向员工管理信息系统empMIS数据库中的departments表插入一条记录。
插入数据SQL语句后,执行结果如下:
语句执行完毕,查看执行结果:
由结果可以看到,insert语句成功插入了一条记录。
使用insert插入数据时,允许“字段名列表”为空,此时,“值列表”中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同,如例4.3所示。
【例4.3】向员工管理信息系统empMIS数据库中的departments表插入一条记录。插入数据SQL语句后,执行结果如下:
语句执行完毕,查看执行结果:
可以看到插入记录成功。数据库中增加了一条dno为4的记录,其他字段值为指定的插入值。本例的insert语句中没有指定插入字段名列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和departments表中字段定义的顺序相同。
2.为表的指定字段插入数据
为表的指定字段插入数据,就是在insert语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值,如例4.4所示。
【例4.4】向员工管理信息系统empMIS数据库中的departments表插入一条记录。
插入数据SQL语句后,执行结果如下:
提示信息表示插入一条记录成功。使用select查询表中的记录,查询结果如下:
可以看到插入记录成功。在这里的dloc字段,如查询结果,显示该字段自动添加了‘北京’。这是因为在创建departments表时,dloc字段设置了默认值为‘北京’。departments表结构见“3.2.4实训(创建员工管理信息系统(empMIS))”。在插入记录时,如果某些字段没有指定插入值,MySQL将插入该字段定义时的默认值。
提示:要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,将无法插入,并且MySQL会产生错误。
3.同时插入多条记录
insert语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:
语法说明:
表名:被插入记录的数据表的表名。
字段名列表:插入记录中字段名的列表。
(值列表1),(值列表2),…,(值列表n):表示插入n个记录中字段的值列表。
【例4.5】向员工管理信息系统empMIS数据库中的employees表插入三条记录。
插入数据SQL语句后,执行结果如下:
语句执行完毕,查看执行结果:
由结果可以看到,insert语句执行后,employees表中添加了3条记录。使用insert同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些字符串的意思分别是:
Records:表明插入的记录条数。
Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
Warnings:表明有问题的数据值,例如发生数据类型转换。
【例4.6】在employees表中,不指定插入列表,同时插入四条新记录。
SQL语句执行结果如下:
语句执行完毕,查看执行结果:
由结果可以看到,insert语句执行后,employees表中添加了4条记录,与前面介绍单个insert语法不同,employees表名后面没有指定插入字段列表,因此values关键字后面的多个值列表都要为每一条记录的每一个字段列指定插入值,并且这些值的顺序必须和employees表中字段定义的顺序相同。带有auto_increment属性的字段插入null值,系统会自动为该字段插入唯一的自增编号。
提示:一个同时插入多行记录的inser t语句可以等同于多个单行插入的insert语句,但是多行的insert语句在处理过程中效率更高。因为MySQL执行单条inser t语句插入多行数据,比使用多条insert语句快。所以,在插入多条记录时,最好选择使用单条insert语句的方式插入。
4.将查询结果插入表中
insert语句用来给数据表插入记录时,指定插入记录的列值。insert还可以将select语句查询的结果插入表中,如果想要从另外一个表中合并个人信息到employees表,不需要把每一条记录的值一个一个输入,只需要使用一条insert语句和一条select语句组成的组合语句,即可快速地从一个或多个表中向一个表中插入多个行。基本语法格式如下:
“表名1”指定待插入数据的表;“字段名列表1”指定待插入表中要插入数据的哪些列;“表名2”指定插入数据是从哪个表中查询出来的;“字段名列表2”指定数据来源于表的查询列,该列表必须和“字段名列表1”中的字段个数相同,数据类型相同;“条件表达式”指定select语句的查询条件。
因为员工管理信息系统empMIS数据库中的salary表中的列与employees表中的部分列相同,因此给salary表插入数据时就可以使用insert…select…,请看例4.7。
【例4.7】把员工的工资信息添加到salary表中。
在执行插入操作之前,使用select语句查看salary表中的数据:
结果显示salary表为空,没有数据,接下来执行插入操作:
语句执行完毕,查看执行结果:
可以看到,插入记录成功,salary表中现在有7条记录。这7条记录中的数据与employees表中对应列的数据完全相同,数据转移成功。