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);
相关推荐
oradh2 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789863 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD3 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward4 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记4 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发4 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB5 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88205 小时前
Mysql并发DML锁等待的优化
数据库·mysql
Database_Cool_5 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
会编程的土豆5 小时前
数据库范式
数据库·oracle