使用INSERT…SELECT语句可以把其他数据表的行记录添加到现有的表中。使用INSERT…SELECT语句比使用多个单行的INSERT语句效率要高得多。使用INSERT…SELECT语句时应该遵循如下的原则:
l 在最外面的查询表中插入所有满足SELECT语句的行。
l 必须检验要插入新行的表是否在数据库中。
l 必须保证接受新值的表中列的数据类型与源表中相应列的数据类型一致。
l 必须明确是否存在默认值,或所有被忽略的列是否允许为空值。如果不允许空值,必须为这些列提供值。
INSERT…SELECT语句的基本语法如下:
INSERT table_name
SELECT column_list
FROM table_list
WHERE search_condirions
下面我们先在【工资管理系统】数据库中创建了一个【新员工信息】表,该表包括有“员工编号”、“员工姓名”、“性别”、“所在部门编号”和“所任职位”共5列,用于存储临时的新员工信息。创建【新员工信息】表的语句如下所示:
USE工资管理系统
GO
CREATE TABLE新员工信息
(
员工编号INT NOT NULL,
员工姓名nvarchar(50) NOT NULL,
性别nvarchar(50) NOT NULL,
所在部门编号INT NULL,
所任职位nvarchar(50) NULL
)
如上述语句所示,该表中的所有列都与【员工信息】表中相对应列的数据类型相同。因此,可直接从目的表中获取要插入的数据值插入到新列中。具体的语句代码如下:
INSERT INTO新员工信息(员工编号,员工姓名,性别,所在部门编号,所任职位)
SELECT员工编号,员工姓名,性别,所在部门编号,所任职位FROM员工信息
执行上述语句后,将返回如下结果:
通过结果可以看出语句向【新员工信息】表中插入了18条记录。使用如下语句查询刚插入的记录,查询结果如图2-22所示。
USE工资管理系统
SELECT * from新员工信息

图2-22 查询【新员工信息】表内容
通过在INSERT语句中使用SELECT语句,实现把【员工信息】表中的数据复制到新创建的【新员工信息】表中。即SELECT语句把数据从【员工信息】表的“员工编号”、“员工姓名”、“性别”、“所在部门编号”和“所任职位”列取出得到一个结果集,然后将这个结果集中的数据依次插入到【新员工信息】表的“员工编号”、“员工姓名”、“性别”、“所在部门编号”和“所任职位”列中。
同样也可以使用带WHERE条件子句的INSERT SELECT语句,将这些数据批量插入到目的表中。例如,将【工资管理系统】数据库【员工信息】表【性别】为“女”的数据插入到【新员工信息】表中,具体语句代码如下所示:
INSERT INTO新员工信息(员工编号,员工姓名,性别,所在部门编号,所任职位)
SELECT员工编号,员工姓名,性别,所在部门编号,所任职位FROM员工信息
WHERE性别='女'
语句执行后,将有4行受影响,利用SELECT语句查询结果如图2-23所示。

图2-23 带WHERE子句插入数据
| 在把数据值从一列复制到另一列时,值所在列不必具有相同数据类型,只要插入目标表的值符合该表的数据限制即可。 |