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 (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表如下 –
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 (OID, DATE, CUSTOMER_ID, AMOUNT) 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 | 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 |
复制特定记录
我们还可以使用带有WHERE子句的SQL SELECT INTO语句创建一个新表,并将现有表中的特定行复制到其中。
语法
以下是使用带有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 |