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);
相关推荐
惜分飞2 分钟前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
chian-ocean2 分钟前
CANN 生态进阶:利用 `profiling-tools` 优化模型性能
数据库·mysql
m0_550024636 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
AC赳赳老秦7 分钟前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
啦啦啦_999921 分钟前
Redis-2-queryFormat()方法
数据库·redis·缓存
玄同7651 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码1 小时前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean1 小时前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer
小Tomkk2 小时前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
qq_12498707532 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计