SQL - SELECT INTO 语句



SQL SELECT INTO 语句

SQL SELECT INTO 语句创建一个新表并将现有表中的数据插入到新创建的表中。新表是根据 SELECT 语句中列的结构自动创建的,并且可以在同一数据库或不同的数据库中创建。

但是,需要注意的是,SELECT INTO 语句不会保留原始表的任何索引、约束或其他属性,并且新表默认不会定义任何主键或外键。因此,如有必要,您可能需要手动将这些属性添加到新表中。

MySQL 不支持 SELECT ... INTO TABLE Sybase SQL 扩展,即在 MySQL 中,您不能使用 SELECT ... INTO 语句将数据从一个表插入到另一个表。作为替代,我们可以使用 INSERT INTO ... SELECT 语句或 CREATE TABLE ... SELECT 语句。

语法

以下是 SQL Server 中 SQL SELECT INTO 语句的基本语法:

SELECT * INTO new_table_name FROM existing_table_name

示例

让我们创建 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)
);

现在,使用 INSERT 语句将值插入此表,如下所示:

INSERT INTO CUSTOMERS 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 表将如下创建:

ID 姓名 (NAME) 年龄 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
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

以下 SELECT INTO 语句创建一个名为 CUSTOMER_BACKUP 的新表并将 CUSTOMERS 表中的数据复制到其中:

SELECT * INTO CUSTOMER_BACKUP FROM CUSTOMERS;

输出

我们得到以下结果。我们可以看到已修改了 7 行。

(7 rows affected)

验证

我们可以使用 SELECT 语句检索表的内容来验证更改是否反映在表中。以下是显示 CUSTOMER_BACKUP 表中记录的查询:

SELECT * from CUSTOMER_BACKUP;

显示的表如下:

ID 姓名 (NAME) 年龄 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
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

从特定列复制数据

我们还可以使用 SQL SELECT INTO 语句将现有表中的特定列的数据复制到新表中。为此,我们只需要在 select 关键字后包含所需的列名即可。

语法

以下是语法:

SELECT column1, column2, ..., columnN
INTO new_table_name
FROM existing_table_name;

示例

在下面的查询中,我们正在创建一个名为 CUSTOMER_DETAILS 的新表,该表仅包含 CUSTOMERS 表中的 NAME、AGE 和 ADDRESS 列,并使用相应的数据填充它。

SELECT name, age, address 
INTO CUSTOMER_DETAILS 
FROM CUSTOMERS;

输出

我们得到以下结果。我们可以看到已修改了 7 行。

(7 rows affected)

验证

我们可以使用 SELECT 语句检索表的内容来验证更改是否反映在表中。以下是显示 CUSTOMER_DETAILS 表中记录的查询:

SELECT * from CUSTOMER_DETAILS;

显示的表如下:

姓名 (NAME) 年龄 (AGE) 地址 (ADDRESS)
Ramesh 32 Ahmedabad
Khilan 25 Delhi
Kaushik 23 Kota
Chaitali 25 Mumbai
Hardik 27 Bhopal
Komal 22 Hyderabad
Muffy 24 Indore

注意:新表将不包含原始表中的任何其他列。原始表也保持不变。

从多个表复制数据

使用 SQL SELECT INTO 语句,我们还可以将数据从多个表复制到新表。这是使用 JOIN 子句完成的,该子句根据公共列组合来自多个表的数据。

语法

以下是使用 SELECT INTO 语句从多个表复制数据的语法:

SELECT column1, column2, ..., columnN
INTO new_table_name
FROM table1
JOIN table2 ON table1.column = table2.column

示例

首先,让我们创建一个名为 ORDERS 的另一个表:

CREATE TABLE ORDERS (
OID INT NOT NULL,
DATE VARCHAR (20) NOT NULL,
CUSTOMER_ID INT NOT NULL,
AMOUNT DECIMAL (18, 2));

使用 INSERT 语句,将值插入此表,如下所示:

INSERT INTO ORDERS VALUES
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

创建的表如下:

OID 日期 (DATE) 客户ID (CUSTOMER_ID) 金额 (AMOUNT)
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

现在,我们正在创建一个名为 CUSTOMER_ORDERS 的新表,其中包括来自 CUSTOMERS 表的客户姓名和来自 ORDERS 表的客户 ID,其中 CUSTOMERS 表中客户的 ID 与 ORDERS 表中客户的 ID 匹配:

SELECT CUSTOMERS.Name, ORDERS.customer_id
INTO CUSTOMER_ORDERS
FROM CUSTOMERS
LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.customer_id;

输出

我们得到以下结果。我们可以看到已修改了 8 行。

(8 rows affected)

验证

我们可以使用 SELECT 语句检索表的内容来验证更改是否反映在表中。以下是显示 CUSTOMER_ORDERS 表中记录的查询:

SELECT * FROM CUSTOMER_ORDERS;

显示的表如下:

姓名 (NAME) customer_id
Ramesh NULL
Khilan 2
Kaushik 3
Kaushik 3
Chailtali 4
Hardik NULL
Komal NULL
Muffy NULL

复制特定记录

我们还可以将 SQL SELECT INTO 语句与 WHERE 子句一起使用,以创建一个新表并将现有表中的特定行复制到其中。

语法

以下是使用带 WHERE 子句的 SELECT INTO 语句的语法:

SELECT *
INTO new_table_name
FROM existing_table_name
WHERE condition;

示例

使用以下查询,我们正在创建一个名为 NameStartsWith_K 的新表,其中包含 CUSTOMERS 表中的所有列,但它只存储姓名以 “k” 开头的客户的记录。

SELECT *
INTO NameStartsWith_K
FROM CUSTOMERS
WHERE NAME LIKE 'k%';

输出

我们得到以下结果。我们可以看到已修改了 3 行。

(3 rows affected)

验证

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

SELECT * from NameStartsWith_K;

显示的表如下:

ID 姓名 (NAME) 年龄 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
6 Komal 22 Hyderabad 4500.00
广告