MySQL INSERT插入语句用法汇总(非常详细)
在使用数据库之前,数据库中必须有数据,MySQL 中使用 INSERT 语句向数据库表中插入新的数据记录。
INSERT 插入数据的方式多种,比如插入完整的记录、插入记录的一部分、插入多条记录以及插入另一个查询的结果。
【实例】在 person 表中,插入一条新记录,id 值为 1,name 值为 Green,age 值为 21,info 值为 Lawyer。执行插入操作之前,使用 SELECT 语句查看表中的数据:
INSERT 语句后面的列名称顺序可以不是 person 表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。
【实例】在 person 表中,插入一条新记录,id 值为 2,name 值为 Suse,age 值为 22,info 值为 dancer,SQL 语句如下:
使用 INSERT 插入数据时,允许列名称列表 column_list 为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
【实例】在 person 表中,插入一条新记录,id 值为 3,name 值为 Mary,age 值为 24,info 值为 Musician,SQL 语句如下:
本例的 INSERT 语句中没有指定字段列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和 person 表中字段定义的顺序相同。
提示,虽然使用 INSERT 插入数据时可以忽略插入数据的列名称,但是值如果不包含列名称,那么 VALUES 关键字后面的值不仅要求完整,而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,对列进行增加、删除或者位置改变操作,这些操作将使得用这种方式插入数据时的顺序也同时改变。如果指定列名称,则不会受到表结构改变的影响。
【实例】在 person 表中,插入一条新记录,name 值为 Willam,age 值为 20,info 值为 sports man,SQL 语句如下:
【实例】在 person 表中,插入一条新记录,name 值为 laura,age 值为 25,SQL 语句如下:
提示,要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,将无法插入,并且 MySQL 会产生错误。
【实例】在 person 表中,在 name、age 和 info 字段指定插入值,同时插入 3 条新记录,SQL 语句如下:
使用 INSERT 同时插入多条记录时,MySQL 会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
【实例】在 person 表中,不指定插入列表,同时插入 2 条新记录,SQL 语句如下:
提示,一个同时插入多行记录的 INSERT 语句等同于多个单行插入的 INSERT 语句,但是多行的 INSERT 语句在处理过程中效率更高。因为 MySQL 执行单条 INSERT 语句插入多行数据比使用多条 INSERT 语句快,所以在插入多条记录时最好选择使用单条 INSERT 语句的方式插入。
基本语法格式如下:
【实例】从 person_old 表中查询所有的记录,并将其插入到 person 表中。
首先,创建一个名为 person_old 的数据表,其表结构与 person 结构相同,SQL 语句如下:
提示,这个例子中使用的 person_old 表和 person 表的定义相同,事实上,MySQL 不关心 SELECT 返回的列名,它根据列的位置进行插入,SELECT 的第 1 列对应待插入表的第 1 列,第 2 列对应待插入表的第 2 列……即使不同列名的表之间也可以方便地转移数据。
INSERT 插入数据的方式多种,比如插入完整的记录、插入记录的一部分、插入多条记录以及插入另一个查询的结果。
1、为表的所有字段插入数据
使用基本的 INSERT 语句插入数据需要指定表名称和插入新记录中的值。基本语法格式为:INSERT INTO table_name (column_list) VALUES (value_list);
- table_name 指定要插入数据的表名;
- column_list 指定要插入数据的那些列;
- value_list 指定每个列需要对应插入的数据。
以表 person 为例,创建语句如下:注意,使用该语句时字段列和数据值的数量必须相同。
CREATE TABLE person ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(40) NOT NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR(50) NULL, PRIMARY KEY (id) );向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。
【实例】在 person 表中,插入一条新记录,id 值为 1,name 值为 Green,age 值为 21,info 值为 Lawyer。执行插入操作之前,使用 SELECT 语句查看表中的数据:
mysql> SELECT * FROM person; Empty set (0.00 sec)结果显示当前表为空,没有数据,接下来执行插入操作:
mysql> INSERT INTO person (id ,name, age , info) VALUES (1,'Green', 21, 'Lawyer');语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+-------+-----+--------+ | id | name | age | info | +----+-------+-----+--------+ | 1 | Green | 21 | Lawyer | +----+-------+-----+--------+可以看到插入记录成功了。在插入数据时,指定了 person 表的所有字段,因此将为每一个字段插入新的值。
INSERT 语句后面的列名称顺序可以不是 person 表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。
【实例】在 person 表中,插入一条新记录,id 值为 2,name 值为 Suse,age 值为 22,info 值为 dancer,SQL 语句如下:
mysql> INSERT INTO person (age ,name, id , info) VALUES (22, 'Suse', 2, 'dancer');语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+-------+-----+--------+ | id | name | age | info | +----+-------+-----+--------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | +----+-------+-----+--------+由结果可以看到,INSERT 语句成功插入了这条记录。
使用 INSERT 插入数据时,允许列名称列表 column_list 为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
【实例】在 person 表中,插入一条新记录,id 值为 3,name 值为 Mary,age 值为 24,info 值为 Musician,SQL 语句如下:
mysql> INSERT INTO person VALUES (3,'Mary', 24, 'Musician');语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+--------+-----+-----------+ | id | name | age | info | +----+--------+-----+-----------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | +----+--------+-----+-----------+可以看到插入记录成功。数据库中增加了一条 id 为 3 的记录,其他字段值为指定的插入值。
本例的 INSERT 语句中没有指定字段列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和 person 表中字段定义的顺序相同。
提示,虽然使用 INSERT 插入数据时可以忽略插入数据的列名称,但是值如果不包含列名称,那么 VALUES 关键字后面的值不仅要求完整,而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,对列进行增加、删除或者位置改变操作,这些操作将使得用这种方式插入数据时的顺序也同时改变。如果指定列名称,则不会受到表结构改变的影响。
2、为表的指定字段插入数据
为表的指定字段插入数据,就是在 INSERT 语句中只向部分字段插入值,而其他字段的值为表定义时的默认值。【实例】在 person 表中,插入一条新记录,name 值为 Willam,age 值为 20,info 值为 sports man,SQL 语句如下:
mysql> INSERT INTO person (name, age,info) VALUES('Willam', 20, 'sports man');提示信息表示插入这条记录成功了。使用 SELECT 查询表中的记录,查询结果如下:
mysql> SELECT * FROM person; +----+--------+-----+-------------+ | id | name | age | info | +----+--------+-----+-------------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man | +----+--------+-----+-------------+可以看到插入记录成功。查询结果显示,该 id 字段自动添加了一个整数值 4。这里,id 字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,MySQL 将插入该字段定义时的默认值。下面的例子说明在没有指定列字段时,插入默认值。
【实例】在 person 表中,插入一条新记录,name 值为 laura,age 值为 25,SQL 语句如下:
mysql> INSERT INTO person (name, age ) VALUES ('Laura', 25);语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+--------+-----+-------------+ | id | name | age | info | +----+--------+-----+-------------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man | | 5 | Laura | 25 | NULL | +----+--------+-----+-------------+可以看到,在本例插入语句中,没有指定 info 字段值,查询结果显示,info 字段在定义时默认为 NULL,因此系统自动为该字段插入空值。
提示,要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,将无法插入,并且 MySQL 会产生错误。
3、同时插入多条记录
INSERT 语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:INSERT INTO table_name (column_list) VALUES (value_list1), (value_list2),...,(value_listn);“value_list1,value_list2,…,value_listn”表示第 1, 2, …, n 个插入记录的字段的值列表。
【实例】在 person 表中,在 name、age 和 info 字段指定插入值,同时插入 3 条新记录,SQL 语句如下:
INSERT INTO person(name, age, info) VALUES ('Evans',27, 'secretary'), ('Dale',22, 'cook'),('Edison',28, 'singer');语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+--------+-----+------------+ | id | name | age | info | +----+--------+-----+------------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man | | 5 | Laura | 25 | NULL | | 6 | Evans | 27 | secretary | | 7 | Dale | 22 | cook | | 8 | Edison | 28 | singer | +----+--------+-----+------------+由结果可以看到,INSERT 语句执行后,person 表中添加了 3 条记录,其 name 和 age 字段分别为指定的值,id 字段为 MySQL 添加的默认的自增值。
使用 INSERT 同时插入多条记录时,MySQL 会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
- Records:表明插入的记录条数。
- Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
- Warnings:表明有问题的数据值,例如发生数据类型转换。
【实例】在 person 表中,不指定插入列表,同时插入 2 条新记录,SQL 语句如下:
INSERT INTO person VALUES (9,'Harry',21, 'magician'), (NULL,'Harriet',19, 'pianist');语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+------------+-----+-----------+ | id | name | age | info | +----+------------+-----+-----------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man| | 5 | Laura | 25 | NULL | | 6 | Evans | 27 | secretary | | 7 | Dale | 22 | cook | | 8 | Edison | 28 | singer | | 9 | Harry | 21 | magician | | 10 | Harriet | 19 | pianist | +----+------------+-----+-----------+由结果可以看到,INSERT 语句执行后,person 表中添加了 2 条记录,与前面介绍单个 INSERT 语法不同,person 表名后面没有指定插入字段列表,因此 VALUES 关键字后面的多个值列表都要为每一条记录的每一个字段列指定插入值,并且这些值的顺序必须和 person 表中字段定义的顺序相同,带有 AUTO_INCREMENT 属性的 id 字段插入 NULL 值,系统会自动为该字段插入唯一的自增编号。
提示,一个同时插入多行记录的 INSERT 语句等同于多个单行插入的 INSERT 语句,但是多行的 INSERT 语句在处理过程中效率更高。因为 MySQL 执行单条 INSERT 语句插入多行数据比使用多条 INSERT 语句快,所以在插入多条记录时最好选择使用单条 INSERT 语句的方式插入。
4、将查询结果插入到表中
INSERT 语句用来给数据表插入记录时指定插入记录的列值。INSERT 还可以将 SELECT 语句查询的结果插入到表中,如果想要从另外一个表中合并个人信息到 person 表,不需要把每一条记录的值一个一个输入,只需要使用一条 INSERT 语句和一条 SELECT 语句组成的组合语句,即可快速地从一个或多个表中向一个表中插入多行。基本语法格式如下:
INSERT INTO table_name1 (column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition)
- table_name1 指定待插入数据的表;
- column_list1 指定待插入表中要插入数据的哪些列;
- table_name2 指定插入数据是从哪个表中查询出来的;
- column_list2 指定数据来源表的查询列,该列表必须和 column_list1 列表中的字段个数相同、数据类型相同;
- condition 指定 SELECT 语句的查询条件。
【实例】从 person_old 表中查询所有的记录,并将其插入到 person 表中。
首先,创建一个名为 person_old 的数据表,其表结构与 person 结构相同,SQL 语句如下:
CREATE TABLE person_old ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(40) NOT NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR(50) NULL, PRIMARY KEY (id) );向 person_old 表中添加两条记录:
mysql> INSERT INTO person_old VALUES (11,'Harry',20, 'student'), (12,'Beckham',31, 'police'); mysql> SELECT * FROM person_old; +----+---------+-----+---------+ | id | name | age | info | +----+---------+-----+---------+ | 11 | Harry | 20 | student | | 12 | Beckham | 31 | police | +----+---------+-----+---------+可以看到,插入记录成功,peson_old 表中现在有两条记录。接下来将 person_old 表中所有的记录插入 person 表中,SQL 语句如下:
INSERT INTO person(id, name, age, info)SELECT id, name, age, info FROM person_old;语句执行完毕,查看执行结果:
mysql> SELECT * FROM person; +----+---------+-----+-----------+ | id | name | age | info | +----+---------+-----+-----------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man| | 5 | Laura | 25 | NULL | | 6 | Evans | 27 | secretary | | 7 | Dale | 22 | cook | | 8 | Edison | 28 | singer | | 9 | Harry | 21 | magician | | 10 | Harriet | 19 | pianist | | 11 | Harry | 20 | student | | 12 | Beckham | 31 | police | +----+---------+-----+-----------+由结果可以看到,INSERT 语句执行后,person 表中多了两条记录,这两条记录和 person_old 表中的记录完全相同,数据转移成功。这里的 id 字段为自增的主键,在插入的时候要保证该字段值的唯一性,如果不能确定,可以在插入的时候忽略该字段,只插入其他字段的值。
提示,这个例子中使用的 person_old 表和 person 表的定义相同,事实上,MySQL 不关心 SELECT 返回的列名,它根据列的位置进行插入,SELECT 的第 1 列对应待插入表的第 1 列,第 2 列对应待插入表的第 2 列……即使不同列名的表之间也可以方便地转移数据。