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
廣告