รวมผลลัพธ์จากสองตารางด้วย UNION ALL และกรองด้วย WHERE
UNION ALL รวมผลลัพธ์จากหลาย SELECT เข้าด้วยกัน (เก็บแถวซ้ำไว้) ต่างจาก UNION ที่ลบแถวซ้ำ ใช้ WHERE ในแต่ละ SELECT เพื่อกรองข้อมูลก่อนรวม
ตัวอย่างสร้างตาราง 2 ตาราง
CREATE TABLE DemoTable1 (Id INT, FirstName VARCHAR(20)); CREATE TABLE DemoTable2 (Id INT, FirstName VARCHAR(20)); INSERT INTO DemoTable1 VALUES (10, 'John'), (20, 'Carol'); INSERT INTO DemoTable2 VALUES (20, 'David'), (40, 'Chris');
ข้อมูลตาราง 1
+------+-----------+ | Id | FirstName | +------+-----------+ | 10 | John | | 20 | Carol | +------+-----------+
ข้อมูลตาราง 2
+------+-----------+ | Id | FirstName | +------+-----------+ | 20 | David | | 40 | Chris | +------+-----------+
คำสั่งรวมตารางทั้งสอง กรอง Id = 20 ทั้งคู่
SELECT * FROM DemoTable1 WHERE Id = 20 UNION ALL SELECT * FROM DemoTable2 WHERE Id = 20;
ผลลัพธ์ (เก็บแถวซ้ำ Id=20 ไว้ทั้งคู่)
+------+-----------+ | Id | FirstName | +------+-----------+ | 20 | Carol | | 20 | David | +------+-----------+
คำอธิบาย:
- จำนวนคอลัมน์และลำดับคอลัมน์ในทุก SELECT ต้องตรงกัน
UNION ALLเร็วกว่าUNIONเพราะไม่ต้องตรวจสอบ/ลบแถวซ้ำ- ใช้
ORDER BYได้เฉพาะท้ายคำสั่งสุดท้าย (ครอบทั้งชุดผลลัพธ์)
กรณีต้องการลบแถวซ้ำ: ใช้ UNION
SELECT * FROM DemoTable1 WHERE Id = 20 UNION SELECT * FROM DemoTable2 WHERE Id = 20;
จะได้แถวเดียว (Carol หรือ David ขึ้นกับการจัดเรียงภายใน)
Best Practice: ระบุคอลัมน์ชัดเจน (SELECT Id, FirstName) แทน SELECT * เพื่อป้องกันปัญหาโครงสร้างตารางเปลี่ยน