在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO ;
那么二者语法上有什么区别?性能上又如何呢?
围绕着这两个问题,今天就来总结对比下:
一:语法区别
1: INSERT INTO SELECT 的语法
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
如果两个表的结构一致,字段类型一致:
INSERT INTO table2
SELECT * FROM table1;
如果两个表结构不一致,只有某几列一致:
INSERT INTO table2 (column_name)
SELECT column_name FROM table1;
2:SELECT INTO 的语法
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
如果想要复制所有的列:
SELECT *
INTO newtable
FROM table1;
如果想要复制部分的列:
SELECT column_name
INTO newtable
FROM table1;
提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。如果想要修改字段的名称,可以使用 AS 子句来应用新名称。
二:性能区别
----创建一个基础数据库 CREATE TABLE TestDataTable( id int not null, userName varchar(20), remark varchar(100) ) ----填充100W测试数据 DECLARE @id INT,@userName NVARCHAR(50),@remark NVARCHAR(50); DECLARE @i INT; SET @id=0; SET @userName =''; SET @remark=''; SET @i=0; WHILE @i<1000000 BEGIN SET @id=@i; IF(@i%2=0) begin set @userName='二狗子'; set @remark='SELECT INTO 最快!' end else begin set @userName='李四'; set @remark='快你妹,INSERT INTO 最快' end INSERT INTO TestDataTable(id,username,remark) VALUES (@id,@username,@remark ) SET @i=@i+1 END
--查询填充后的数据 SELECT * FROM TestDataTable
--删除表结构以及数据【慎用】 DROP Table TestDataTable
耗时1分钟58秒,数据填充好了,真是不给力,竟然用了快2分钟;
好了,在去创建一个目标数据库;
--创建一个目标数据库,把100W数据复制到这个里面取 CREATE TABLE TargetDB( id int not null, userName varchar(20), remark varchar(100) )
测试1:INSERT INTO SELECT
SET STATISTICS TIME ON INSERT INTO TargetDB SELECT * FROM TestDataTable GO SET STATISTICS TIME OFF
测试2:SELECT INTO
SET STATISTICS TIME ON SELECT * INTO TargetDB FROM TestDataTable GO SET STATISTICS TIME OFF
三:结论
经过上面的对比,可以看出SELECT INTO 的性能要比INSERT INTO 快出不少;
虽然SELECT INTO 数据的导入速度有很大优势,但是也有不好的地方,就是此语句只能在目标表没有创建的情况下使用,如果目标表结构已经存在,就会提示数据库中已存在名为 'TargetDB' 的对象(如下图),此时就只能用INSERT INTO SELECT 方式去操作了。