UNION ALL รวมผลลัพธ์จากหลาย SELECT เข้าด้วยกัน (ไม่ลบ Duplicate) สามารถนำไปใช้กับ INSERT ... SELECT เพื่อเพิ่มข้อมูลลงหลายตาราง หรือเพิ่มหลายชุดข้อมูลลงตารางเดียวในคำสั่งเดียว
ตัวอย่าง: Insert ลงสองตารางจาก SELECT เดียว
สร้างตาราง 1 (รายละเอียด):
mysql> CREATE TABLE DemoTable1 (
-> StudentName VARCHAR(20),
-> StudentMarks INT
-> );
สร้างตาราง 2 (เฉพาะชื่อ):
mysql> CREATE TABLE DemoTable2 (Name VARCHAR(20));
เพิ่มข้อมูลในตาราง 2:
mysql> INSERT INTO DemoTable2 VALUES ('Chris');
Insert ลงตาราง 1 จากตาราง 2 พร้อมคะแนนต่างกัน (UNION ALL):
mysql> INSERT INTO DemoTable1
-> SELECT Name, 89 FROM DemoTable2
-> UNION ALL
-> SELECT Name, 98 FROM DemoTable2;
ผลลัพธ์ในตาราง 1 (2 แถวจาก 1 ชื่อ):
mysql> SELECT * FROM DemoTable1; +-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 89 | | Chris | 98 | +-------------+--------------+
ความแตกต่าง UNION vs UNION ALL
| คำสั่ง | พฤติกรรม | ประสิทธิภาพ |
|---|---|---|
| UNION | รวม + ลบ Duplicate (Distinct) | ช้ากว่า (ต้อง Sort/Hash เพื่อ Distinct) |
| UNION ALL | รวมทุกแถว (รวม Duplicate) | เร็วกว่า (ไม่ต้อง Distinct) |
กรณีการใช้งานอื่นๆ
-- เพิ่มข้อมูลหลายชุดลงตารางเดียว INSERT INTO target_table (col1, col2) SELECT 'A', 1 UNION ALL SELECT 'B', 2 UNION ALL SELECT 'C', 3; -- Insert จากหลายตาราง INSERT INTO summary (category, total) SELECT 'Sales', SUM(amount) FROM sales UNION ALL SELECT 'Returns', SUM(amount) FROM returns UNION ALL SELECT 'Discounts', SUM(amount) FROM discounts; -- สร้างข้อมูลทดสอบ (Generate Series) INSERT INTO numbers (n) SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5;
ข้อควรระวัง
- จำนวนคอลัมน์และชนิดข้อมูลในทุก SELECT ต้องตรงกัน
- UNION ALL ไม่ลบ Duplicate → อาจได้ข้อมูลซ้ำ (ตั้งใจหรือไม่ตั้งใจ)
- ORDER BY ใช้ได้เฉพาะ SELECT ตัวสุดท้าย หรือใช้ Subquery/Parentheses
- LIMIT ใช้ได้กับ SELECT แต่ละตัว (ต้องใส่ใน Parentheses)
ประโยชน์
- ลด Round-trip Network (1 Query แทนหลาย Query)
- Atomic: สำเร็จทั้งหมดหรือล้มเหลวทั้งหมด (ใน Transaction)
- รวดเร็วกว่า Loop Insert ใน Application