Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การใช้ UNION ALL เพิ่มข้อมูลในสองตารางด้วยคำสั่งเดียวใน MySQL

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