SQL里那个SELECT INTO和INSERT INTO SELECT到底啥区别和用法介绍
- 问答
- 2025-12-31 02:37:08
- 2
SELECT INTO和INSERT INTO SELECT都用于将数据从一个表复制到另一个表,但它们的核心区别在于:SELECT INTO是“连桌子带菜一起新做一份”,而INSERT INTO SELECT是“找一个现成的空盘子,把菜装进去”。
下面我们来详细拆解一下。
SELECT INTO:创建新表并插入数据
SELECT INTO语句的主要特点是在操作过程中会创建一个全新的表,然后将源表中的数据插入到这个新创建的表中,这个新表的结构(包括列名、数据类型等)是由SELECT查询的列列表决定的。
基本语法: 根据微软文档(Microsoft Docs - SELECT INTO),其基本语法格式是:
SELECT 列1, 列2, ... INTO 新表名 FROM 源表名 [WHERE 条件];
关键特性和用法:
- 自动建表:这是它最核心的功能,你不需要事先用CREATE TABLE语句来定义新表,数据库系统会根据SELECT出来的结果集自动推断并创建一张结构匹配的新表,你从源表选择了ID、Name、Age三列,那么新表就会自动创建这三列,数据类型也与源表对应列保持一致。
- 数据备份和快照:这个功能非常适合于创建数据备份或某个时间点的快照,你想在批量更新某个表之前留个底,可以这样写:
SELECT * INTO Employees_Backup_20231027 FROM Employees;
执行后,一张名为
Employees_Backup_20231027的新表就诞生了,里面包含了原Employees表的所有数据。 - 创建临时表:它也常用于创建临时表,用于存储复杂查询的中间结果,以便后续查询使用,临时表通常在会话结束后自动销毁。
SELECT CustomerID, SUM(OrderAmount) AS TotalAmount INTO #CustomerTotals -- 在SQL Server中,#号开头表示本地临时表 FROM Orders GROUP BY CustomerID;
- 注意事项:
- 新表的结构限制:新表的结构完全源于SELECT查询,它不会复制源表的约束(如主键、外键)、索引、默认值或触发器,你得到的就是一个纯粹的、包含数据的“空壳”表。
- 表不存在:执行SELECT INTO时,目标新表必须不存在,否则会报错。
INSERT INTO SELECT:向已存在的表插入数据

INSERT INTO SELECT语句的核心特点是目标表必须已经存在,它的作用是将从源表查询到的数据,追加插入到这张已经存在的目标表中。
基本语法: 根据通用的SQL语法,其格式为:
INSERT INTO 目标表名 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表名 [WHERE 条件];
关键特性和用法:
- 目标表需预先存在:在使用INSERT INTO SELECT之前,你必须确保目标表已经被CREATE TABLE语句创建好了。
- 数据追加:它不会影响目标表原有的数据,只是在原有数据的末尾追加新的数据行,非常适合用于数据合并、数据归档等场景。
- 结构匹配:要求SELECT查询出来的列数、顺序和数据类型必须与INSERT INTO后面指定的目标表列完全匹配,如果目标表有标识列(自增ID),可能需要特殊处理(如SET IDENTITY_INSERT ON)。
- 应用场景举例:
- 数据汇总:将来自多个分表的数据汇总到一张总表中。
-- 假设有一个月销售表 Sales_202310,需要汇总到年总表 Annual_Sales INSERT INTO Annual_Sales (ProductID, SaleDate, Amount) SELECT ProductID, SaleDate, Amount FROM Sales_202310;
- 数据迁移:将数据从旧表结构迁移到新设计的新表中。
- 测试数据填充:为已经建好的测试表批量生成或填充测试数据。
- 数据汇总:将来自多个分表的数据汇总到一张总表中。
核心区别总结
现在我们可以清晰地对比一下:

-
目标表的存在性:
- SELECT INTO:目标表不能存在,语句执行时自动创建。
- INSERT INTO SELECT:目标表必须事先存在。
-
主要用途:
- SELECT INTO:主要用于快速创建新表并填充数据,常见于备份、创建快照、生成临时工作表。
- INSERT INTO SELECT:主要用于向已有表中追加数据,常见于数据合并、归档、迁移。
-
对表结构的复制:
- SELECT INTO:只复制数据和不包含约束的列结构。
- INSERT INTO SELECT:不负责创建表结构,只关心数据的插入,表结构需要提前定义好。
一个简单的类比
为了让你印象更深刻,我们再回到开头的比喻:
- 你想做一份宫保鸡丁的副本。
- 使用SELECT INTO,就像是直接走进厨房,找来新的锅碗瓢盆(创建新表),然后按照原菜谱做出一份全新的宫保鸡丁(插入数据)。
- 使用INSERT INTO SELECT,则是你提前准备好一个空盘子(已存在的目标表),然后从已有的那一大盘宫保鸡丁里(源表),舀一勺到你自己的盘子里(插入数据)。
选择使用哪个语句,完全取决于你的需求:是需要一张瞬间诞生的新表,还是需要往老表里添砖加瓦,理解了这一点,在实际工作中就能准确地运用它们了。
本文由太叔访天于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/71625.html
