การสร้างตารางใหม่และเติมข้อมูลจากผลลัพธ์ของ SELECT query สามารถทำได้ด้วยคำสั่ง INSERT ... SELECT หรือ CREATE TABLE ... AS SELECT
วิธีที่ 1: INSERT INTO ... SELECT (ตารางปลายทางมีอยู่แล้ว)
INSERT INTO target_table (col1, col2, col3)
SELECT col1, col2, col3
FROM source_table;
- ตารางปลายทางต้องมีอยู่แล้ว
- จำนวนและลำดับคอลัมน์ต้องตรงกัน
- ชนิดข้อมูลต้องเข้ากันได้
วิธีที่ 2: CREATE TABLE ... AS SELECT (CTAS) - สร้างตารางใหม่พร้อมข้อมูล
CREATE TABLE new_table AS
SELECT col1, col2, col3
FROM source_table;
- สร้างตารางใหม่พร้อมโครงสร้างและข้อมูลในคำสั่งเดียว
- ไม่คัดลอก Index, Primary Key, Auto Increment, Constraints, Triggers
- ใช้
CREATE TABLE new_table LIKE source_tableก่อน แล้วINSERT SELECTหากต้องการโครงสร้างเหมือนกัน
ตัวอย่างการใช้งาน
1. สร้างตารางต้นทางและเพิ่มข้อมูล
CREATE TABLE PopulateTableDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(20),
Amount INT,
ArrivalDateTime DATETIME,
PRIMARY KEY (Id)
);
INSERT INTO PopulateTableDemo (Name, Amount, ArrivalDateTime) VALUES
('John', 456, '2018-02-04'),
('Carol', 1000, '2019-10-21'),
('Sam', 970, '2019-07-25'),
('Larry', 1050, '2015-10-28');
ข้อมูลต้นทาง:
+----+-------+--------+---------------------+
| Id | Name | Amount | ArrivalDateTime |
+----+-------+--------+---------------------+
| 1 | John | 456 | 2018-02-04 00:00:00 |
| 2 | Carol | 1000 | 2019-10-21 00:00:00 |
| 3 | Sam | 970 | 2019-07-25 00:00:00 |
| 4 | Larry | 1050 | 2015-10-28 00:00:00 |
+----+-------+--------+---------------------+
2. สร้างตารางปลายทาง (โครงสร้างต่างออกไป)
CREATE TABLE PopulateQueryFromAnotherTable (
Id INT NOT NULL AUTO_INCREMENT,
UserName VARCHAR(20),
Salary INT,
DepartureDateTime DATETIME,
PRIMARY KEY (Id)
);
3. คัดลอกข้อมูล (Mapping คอลัมน์)
INSERT INTO PopulateQueryFromAnotherTable (UserName, Salary, DepartureDateTime)
SELECT Name, Amount, ArrivalDateTime
FROM PopulateTableDemo;
ผลลัพธ์: Query OK, 4 rows affected
4. ตรวจสอบข้อมูลในตารางปลายทาง
SELECT * FROM PopulateQueryFromAnotherTable;
+----+----------+--------+---------------------+
| Id | UserName | Salary | DepartureDateTime |
+----+----------+--------+---------------------+
| 1 | John | 456 | 2018-02-04 00:00:00 |
| 2 | Carol | 1000 | 2019-10-21 00:00:00 |
| 3 | Sam | 970 | 2019-07-25 00:00:00 |
| 4 | Larry | 1050 | 2015-10-28 00:00:00 |
+----+----------+--------+---------------------+
เทคนิคเพิ่มเติม
คัดลอกเฉพาะบางเงื่อนไข
INSERT INTO target (col1, col2)
SELECT col1, col2 FROM source WHERE status = 'active';
คำนวณค่าใหม่ระหว่างคัดลอก
INSERT INTO target (name, total_price)
SELECT name, price * qty FROM source;
ใช้ฟังก์ชันแปลงข้อมูล
INSERT INTO target (name, created_date)
SELECT UPPER(name), DATE(created_at) FROM source;
สรุปการเลือกวิธี
| สถานการณ์ | คำสั่งแนะนำ |
|---|---|
| ตารางปลายทางมีอยู่แล้ว, โครงสร้างต่างกัน | INSERT INTO ... SELECT |
| ต้องการสร้างตารางใหม่ด่วน, ไม่ต้องการ Index/PK | CREATE TABLE ... AS SELECT |
| ต้องการโครงสร้างเหมือนกันทุกอย่าง (PK, Index, AI) | CREATE TABLE ... LIKE + INSERT SELECT |