INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中;
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中
想象一下你有两个本子(数据库里的表):
本子A
(源头):里面记录了很多信息,比如所有朋友的电话号码。本子B
(目的地):可能是空的,也可能已经有一些信息了。
现在来看这两个操作:
1. INSERT INTO SELECT
(往 已有的 本子里 加 内容)
- 作用 :从一个表(
本子A
)里选出一些数据,然后把这些选出来的数据 插入 到 另一个已经存在 的表(本子B
)里。 - 通俗理解 :你觉得
本子A
里记录的"老同学"的电话很有用,想把他们 也 记录到你 已经有 的本子B
(比如叫"重要联系人")里。你不会扔掉本子B
,只是在后面 追加 这些老同学的电话。 - 关键点 :
本子B
(目标表)必须提前存在。- 通常是往
本子B
里 增加 数据行,原有数据一般不动。 - 你需要确保从
本子A
选出来的数据格式(列的数量、类型)能对应放到本子B
的列里。
2. SELECT INTO
(直接 新建 一个本子并 装满 内容)
- 作用 :从一个表(
本子A
)里选出一些数据,然后用这些选出来的数据 创建一个全新的表 (我们叫它本子C
),并把数据 直接放进去。 - 通俗理解 :你想把
本子A
里所有"北京"的朋友单独整理出来。于是你 拿出一个全新的、空白的本子 (本子C
),然后把本子A
里所有北京朋友的信息 抄写 到这个 新本子 里。操作完成后,你就多了一个专门记录北京朋友的本子C
。 - 关键点 :
本子C
(目标表)在操作前不能存在 ,这个命令会 自动创建 它。- 新创建的
本子C
的结构(列名、数据类型)通常是根据你从本子A
选择的数据来决定的。 - 重要提示 :
SELECT INTO
的语法在不同的数据库系统里可能不一样!- 在 SQL Server 或 MS Access 里,就用
SELECT ... INTO 新表 FROM ...
。 - 在 MySQL , PostgreSQL , Oracle 等数据库里,通常用
CREATE TABLE 新表 AS SELECT ... FROM ...
来实现类似的功能。虽然名字不同,但做的事情(根据查询结果创建新表并填充数据)是一样的。
- 在 SQL Server 或 MS Access 里,就用
关系和区别总结
- 关系 :两者都涉及到从一个地方(源表/查询)选择 (SELECT) 数据,然后把数据放到另一个地方。
- 核心区别 :
- 目标是否存在 :
INSERT INTO SELECT
的目标表 必须已存在 ;SELECT INTO
(或CREATE TABLE AS SELECT
) 的目标表 必须不存在,它会帮你创建。 - 主要用途 :
INSERT INTO SELECT
主要用于 追加数据、合并数据到现有结构中、数据归档(把旧数据移到另一个已存在的归档表)。SELECT INTO
(或CREATE TABLE AS SELECT
) 主要用于 创建新表、快速备份表的某个子集、创建临时表用于复杂查询或报表。
- 目标是否存在 :
生动形象的例子
例子一:用 INSERT INTO SELECT
整理会员等级
- 场景 :你有一个网店,有一个
Customers
表记录所有顾客信息,还有一个 已经存在 的VIP_Customers
表,专门存放 VIP 顾客信息。现在你想把Customers
表里消费额超过 5000 元的顾客,加入 到VIP_Customers
表里。 - 操作 (类似
INSERT INTO SELECT
) :- 你拿出 已经有 的
VIP_Customers
会员名册(目标表已存在)。 - 你翻看
Customers
总顾客名单(源表),找出消费超过 5000 的人。 - 你把这些人的信息 抄写/添加 到
VIP_Customers
名册的 后面。
- 你拿出 已经有 的
- 数据库语句 (概念性) :
INSERT INTO VIP_Customers (CustomerID, Name, JoinDate) SELECT CustomerID, Name, RegistrationDate FROM Customers WHERE TotalSpent > 5000;
例子二:用 SELECT INTO
(或 CREATE TABLE AS SELECT
) 制作临时活动名单
- 场景 :你要为下个月过生日的顾客举办一个特别活动。你需要 临时创建一个新名单,只包含这些顾客的姓名和邮箱,方便发送邀请邮件。
- 操作 (类似
SELECT INTO
/CREATE TABLE AS SELECT
) :- 你 拿出一张全新的白纸 (目标表不存在,将被创建)。
- 你翻看
Customers
总顾客名单(源表),找出下个月过生日的人。 - 你把这些人的姓名和邮箱 抄写 到这张 新白纸 上,形成一个独立的"下月生日顾客活动名单"。
- 数据库语句 (SQL Server 概念性) :
SELECT Name, Email INTO BirthdayCampaignList FROM Customers WHERE MONTH(BirthDate) = MONTH(GETDATE() + INTERVAL '1' MONTH);
- 数据库语句 (MySQL/PostgreSQL 概念性) :
CREATE TABLE BirthdayCampaignList AS SELECT Name, Email FROM Customers WHERE MONTH(BirthDate) = MONTH(CURDATE() + INTERVAL 1 MONTH);