在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到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 方式去操作了。



 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信