浅析批量新增查询到的结果集到另一个表INSERT INTO SELECT、及 SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
一、基本语法
INSERT INTO "表格1" ("栏位1", "栏位2", ...) SELECT "栏位3", "栏位4", ... FROM "表格2"
1、从一张表中查询到的数据插入到另一张表
INSERT INTO A ([姓名] ,[部门])
SELECT [name] ,[DEP]
FROM B
where [company]='北京公司' and date= '2013-06-21'
2、把B表在A表不存在的数据插入到A
INSERT INTO A ([姓名] ,[部门])
SELECT [name] ,[DEP] FROM B WHERE NO EXISTS(SELECT [姓名] ,[部门] FROM A WHERE A.ID = B.ID)
3、插入多条数据使用默认数据
insert into [G]([员工编号],[姓名],[公司],[类型],[记录],[updatetime])
SELECT '00001','张三','北京,'年假','2',getdate() UNION all
SELECT '00002','李四','北京','年假','5',getdate()
二、SQL实现将一个表的数据插入另一个表
1、第一种情况:一个表的数据插入另一个存在的表 - insert into select
-- 1. 如果2张表的字段一致,并且希望插入全部数据,可以用这种方法
INSERT INTO 目标表 SELECT * FROM 来源表;
-- 比如要将 articles 表插入到 newArticles 表中,则是:
INSERT INTO newArticles SELECT * FROM articles;
-- 2. 如果只希望导入指定字段,可以用这种方法:
INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表;
2、第二种情况:一个表的数据插入另一个不存在的表 - select into
-- 4. 如果将一个表的数据放在另外一个不存在的表:
select * into 目标不存在的表 from 来源表
-- 5. 如果只希望导入指定字段,可以用这种方法
select 字段1,字段2,... into 目标不存在的表 from 来源表
三、SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
我们经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。
(一)INSERT INTO SELECT语句
1、语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
或者:Insert into Table2 select * from Table1
2、注意:
(1)需要目标表必须存在,且字段也必须存在
(2)注意Table2的主键约束,如果Table2有主键且不为空,则 field1,field2...中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
(4)由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量
(二)SELECT INTO FROM语句
语句形式为:SELECT value1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中
注意:MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。当然你可以使用以下语句来拷贝表结构及数据
CREATE TABLE 新表
AS
SELECT * FROM 旧表
(3)2种语句区别
select into from 和 insert into select 都是用来复制表,两者的主要区别为:
select into from 要求目标表不存在,因为在插入时会自动创建;
insert into select from 要求目标表存在。
-- 1. 复制表结构及其数据:
create table table_name_new as select * from table_name_old
-- 2. 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
-- 或者:
create table table_name_new like table_name_old
-- 3. 只复制表数据:
-- 如果两个表结构一样:
insert into table_name_new select * from table_name_old
-- 如果两个表结构不一样:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
稍微整理一下 select into from 和 insert into select 的理解层面的区别
select into from :将查询出来的数据整理到一张新表中保存,表结构与查询结构一致。
select *(查询出来的结果) into newtable(新的表名)from where (后续条件)
即,查询出来结果--->复制一张同结构的空表--->将数据拷贝进去。
insert into select :为已经存在的表批量添加新数据。
insert into (准备好的表) select *(或者取用自己想要的结构)from 表名 where 各种条件
即,指定一张想要插入数据的表格--->对数据进行加工筛选--->填入一张准备好的表格。
嗯,可能理解的比较粗浅,希望有知识经验的大佬及时订正。