Mysql 简明教程

MySQL - Insert Into Select

The MySQL Insert Into Select Statement

在 MySQL 中, INSERT INTO…​ SELECT 语句用于将现有表中的一行或多行添加到/插入到目标表。

此语句结合了两个不同的语句:INSERT INTO 和 SELECT。

  1. MySQL INSERT INTO 语句是数据库管理中常用的命令,它只需要表名和要插入到表中的值。但是,重要的是要确保要插入的数据与表列的结构和数据类型相匹配。

  2. SELECT 语句用于从现有数据库表中获取数据。

当一起使用上述语句时,SELECT 语句首先从现有表中获取数据, INSERT INTO 语句将检索到的数据插入到另一张表(如果它们具有相同的表结构)。

Syntax

以下是使用插入到 select 语句的语法 −

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

在我们执行以下查询之前,需要考虑以下一些重要事项 −

  1. 在我们要插入数据的数据库中,必须已经存在一个表。

  2. 源表和目标表都必须匹配其结构。

Example

首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下查询在上述创建的表中插入 7 条记录 −

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

执行以下查询以从 CUSTOMERS 表中检索所有记录 −

Select * From CUSTOMERS;

以下为 CUSTOMERS 表 −

Inserting Required Data from one Table to Another Table

我们可能会遇到某些实例,我们只想向另一张表添加少量记录。这可以通过使用 WHERE 子句来实现,该子句选择查询返回的所有行数。

Example

在此之前,让我们创建一个名为 CUSTOMERS_copy 的另一个表,其结构与先前创建的 CUSTOMERS 表类似 −

CREATE TABLE CUSTOMERS_copy (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

在以下查询中,我们尝试从 CUSTOMERS 表中获取记录并将它们插入到 CUSTOMERS_copy 表中。

INSERT INTO CUSTOMERS_copy (ID, NAME, AGE, ADDRESS, SALARY)
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS
WHERE AGE >= 25;

Output

以上程序的输出如下所示:

Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

Verification

若要确认年龄为 25 岁或以上的 'CUSTOMERS' 表中的记录是否已插入到目标表 'CUSTOMERS_copy' 中,请执行以下查询 −

SELECT * FROM CUSTOMERS_copy;

年龄为 25 岁或以上的人员的记录如下所示 −

Inserting the rows with LIMIT

通过使用 MySQL LIMIT 子句,我们可以指定从查询中添加到目标表的行数。

Example

在继续进行之前,首先让我们使用以下查询截断 CUSTOMERS_copy 表中的所有行 −

TRUNCATE TABLE CUSTOMERS_copy;

现在,我们将使用 LIMIT 子句按客户的 AGE 排序,插入 CUSTOMERS 表中前 3 条记录 −

INSERT INTO CUSTOMERS_copy (ID, NAME, AGE, ADDRESS, SALARY)
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS
ORDER BY AGE LIMIT 3;

Output

以上程序的输出如下所示:

Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

Verification

执行以下查询以验证记录是否反映在 CUSTOMERS_copy 表中 −

SELECT * FROM CUSTOMERS_copy;

以下是记录:

Inserting All Columns from one Table to Another Table

我们还可以将从一个表中的每一列插入到另一个表中。若要执行此操作,以下为语法 −

INSERT INTO table2
SELECT * FROM table1

在插入所有记录之前,首先使用该语句截断 CUSTOMERS_copy 表中的所有行 −

TRUNCATE TABLE CUSTOMERS_copy;

在以下查询中,我们尝试将 CUSTOMERS 表中的所有列添加到 CUSTOMERS_copy 表中 −

INSERT INTO CUSTOMERS_copy SELECT * FROM CUSTOMERS;

Output

没有任何错误地插入了所有列。

Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

Verification

我们可以使用 SELECT 语句检索其内容来验证更改是否反映在 CUSTOMERS_copy 表中。

SELECT * FROM CUSTOMERS_copy;

以下为 CUSTOMERS_copy 表 −

INSERT INTO SELECT Using a Client Program

除了使用 MySQL 查询执行 INSERT INTO …​ SELECT 语句之外,我们还可以使用 Node.js、PHP、Java 和 Python 等客户端程序来取得相同的结果。

Syntax

以下是此操作在各种编程语言中的语法 −

Example

以下是这些程序 −