MySQL - Insert Into Select:初学者全面指南

你好,未来的数据库大师们!今天,我们将踏上一段激动人心的旅程,探索MySQL的世界,特别是强大的“Insert Into Select”语句。如果你是编程新手,不用担心——我会成为你的友好向导,一步步解释所有内容。那么,来一杯咖啡,让我们开始吧!

MySQL - Insert Into Select

MySQL Insert Into Select 语句

想象一下你在整理书架。你有一堆新书(我们称之为源数据),你想把它们添加到已经整理好的书架上(我们的目标表)。这正是MySQL中的“Insert Into Select”语句所做的——它允许我们从一个表中复制数据并将其插入到另一个表中。

基本语法如下:

INSERT INTO 目标表 (列1, 列2, 列3, ...)
SELECT 列1, 列2, 列3, ...
FROM 源表
WHERE 条件;

让我们分解一下:

  • INSERT INTO 目标表:这是我们放置新数据的地方。
  • (列1, 列2, ...)):这是我们目标表中要填充的列。
  • SELECT ...:这是我们获取数据的地方。
  • FROM 源表:这是我们复制数据的表。
  • WHERE 条件:这是可选的,但它允许我们过滤我们要复制的内容。

从一个表向另一个表插入所需数据

现在,让我们用一些真实的代码来实操一下!假设我们有两个表:old_booksnew_arrivals。我们想要把所有奇幻书籍从 old_books 移动到 new_arrivals

INSERT INTO new_arrivals (标题, 作者, 类型)
SELECT 标题, 作者, 类型
FROM old_books
WHERE 类型 = '奇幻';

在这个例子中:

  • 我们正在向 new_arrivals 插入,指定我们想要填充的列。
  • 我们从 old_books 中选择相同的列。
  • 我们只选择类型为 '奇幻' 的书籍。

这个查询将会把所有奇幻书籍从 old_books 复制到 new_arrivals。就像魔法一样,把所有奇幻书籍瞬间传送到新书架上!

使用 LIMIT 插入行

有时,我们不想一次移动所有内容。也许我们正在测试,或者我们只有空间放几本书。这时 LIMIT 就派上用场了。

INSERT INTO 畅销书 (标题, 作者, 销量)
SELECT 标题, 作者, 销量
FROM 所有书籍
WHERE 销量 > 1000000
ORDER BY 销量 DESC
LIMIT 10;

这个查询:

  • 向我们的 畅销书 表插入。
  • 所有书籍 中选择销量超过一百万的书籍。
  • 按销量降序排列。
  • 只取前10个。

就像挑选出最好的——只有前10个畅销书能上我们的特别书架!

从一个表向另一个表插入所有列

有时,我们想要复制一切——每一个细节。我们也可以做到!假设我们正在存档我们整个2022年的销售数据:

INSERT INTO sales_archive_2022
SELECT *
FROM current_sales
WHERE YEAR(销售日期) = 2022;

这里发生了什么:

  • 我们在 INSERT INTO 部分没有指定列。
  • 我们使用 SELECT * 来选择所有列。
  • 我们过滤只包括2022年的销售。

这就好比拍下了你整个2022年书架的快照,并在新的位置精确地重建它。

使用客户端程序执行 INSERT INTO SELECT

现在,让我们谈谈如何使用客户端程序在MySQL之外执行这个操作。我会用Python举个例子,Python是数据库操作中非常流行的语言。

import mysql.connector

# 连接到数据库
mydb = mysql.connector.connect(
host="localhost",
user="你的用户名",
password="你的密码",
database="你的数据库"
)

mycursor = mydb.cursor()

# 我们的 INSERT INTO SELECT 查询
sql = """
INSERT INTO new_arrivals (标题, 作者, 类型)
SELECT 标题, 作者, 类型
FROM old_books
WHERE 类型 = '奇幻'
"""

# 执行查询
mycursor.execute(sql)

# 提交更改
mydb.commit()

print(mycursor.rowcount, "条记录已插入。")

这个脚本:

  1. 连接到你的MySQL数据库。
  2. 创建一个游标对象与数据库交互。
  3. 定义我们的 INSERT INTO SELECT 查询。
  4. 执行查询。
  5. 提交更改(非常重要!)
  6. 打印出插入的记录数。

就像有一个机器人助手可以为你重新整理书架!

结论

好了,各位!我们已经穿越了MySQL中的“Insert Into Select”领域。从基本概念到实际应用,我们都涵盖了。记住,熟能生巧,所以不要害怕用这些查询来实验。

下面是我们讨论过的方法的快速参考表:

方法 描述 示例
基本插入 从一个表复制数据到另一个表 INSERT INTO 目标 SELECT * FROM 源
插入特定列 只复制某些列 INSERT INTO 目标 (列1, 列2) SELECT 列1, 列2 FROM 源
带条件的插入 复制满足特定条件的数据 INSERT INTO 目标 SELECT * FROM 源 WHERE 条件
带LIMIT的插入 复制限定数量的行 INSERT INTO 目标 SELECT * FROM 源 LIMIT 10
插入所有列 不指定列名复制所有列 INSERT INTO 目标 SELECT * FROM 源
使用客户端程序 从MySQL外部执行Insert Into Select 参见上面的Python示例

快乐查询,愿你的数据库永远井井有条且高效!

Credits: Image by storyset