SQL(8):INSERT INTO SELECT与SELECT INTO,选数据出来,放到另一个表中

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中;

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中

想象一下你有两个本子(数据库里的表):

  1. 本子A (源头):里面记录了很多信息,比如所有朋友的电话号码。
  2. 本子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 ServerMS Access 里,就用 SELECT ... INTO 新表 FROM ...
      • MySQL , PostgreSQL , Oracle 等数据库里,通常用 CREATE TABLE 新表 AS SELECT ... FROM ... 来实现类似的功能。虽然名字不同,但做的事情(根据查询结果创建新表并填充数据)是一样的。

关系和区别总结

  • 关系 :两者都涉及到从一个地方(源表/查询)选择 (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)
    1. 你拿出 已经有VIP_Customers 会员名册(目标表已存在)。
    2. 你翻看 Customers 总顾客名单(源表),找出消费超过 5000 的人。
    3. 你把这些人的信息 抄写/添加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)
    1. 拿出一张全新的白纸 (目标表不存在,将被创建)。
    2. 你翻看 Customers 总顾客名单(源表),找出下个月过生日的人。
    3. 你把这些人的姓名和邮箱 抄写 到这张 新白纸 上,形成一个独立的"下月生日顾客活动名单"。
  • 数据库语句 (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);
相关推荐
脑子慢且灵14 分钟前
MySQL:存储函数和存储过程
数据库·mysql·oracle·存储过程·存储函数
是大强1 小时前
mongodb 远程访问
数据库·mongodb
双叶8361 小时前
(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
c语言·开发语言·数据库·单片机·嵌入式硬件·mongodb·51单片机
Themberfue1 小时前
SQL ⑧-事务
数据库·sql·mysql
嘉嘉king1 小时前
数据库的基本概念
数据库·mysql·oracle
leegong231112 小时前
数据库ocp证书是什么水平
数据库·oracle
☞无能盖世♛逞何英雄☜2 小时前
Web三漏洞学习(其二:sql注入)
数据库·sql·学习
2401_824256862 小时前
Spark-SQL(二)
大数据·sql·spark
GOTXX3 小时前
【Qt】Qt 信号与槽机制全解析
开发语言·数据库·c++·qt·多线程·用户界面
[太阳]883 小时前
【无标题】Spark-SQL编程(2)
大数据·sql·spark