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);
相关推荐
线条128 分钟前
Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法
数据库·hive·sql
字节源流40 分钟前
【MYSQL】索引篇(一)
数据库·mysql
n33(NK)44 分钟前
MySQL中count(1)和count(*)的区别及细节
数据库·mysql
heart000_12 小时前
MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
数据库·mysql
凭君语未可3 小时前
MySQL中COUNT(*)、COUNT(1)和COUNT(字段名)的深度剖析与实战应用
数据库·mysql
z人间防沉迷k3 小时前
MySQL事务和索引原理
数据库·笔记·sql·mysql
z人间防沉迷k4 小时前
字符串索引、幻读的解决方法
数据库·sql·mysql
xiaohezi4 小时前
Milvus 向量数据库快速入门(人话版)
数据库
shangjg34 小时前
Kafka ACK机制详解:数据可靠性与性能的权衡之道
java·数据库·分布式·后端·kafka
岁忧4 小时前
LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分
数据库·sql·leetcode