การรวม UNION และ IN() เพื่อกรองข้อมูลจากหลายตาราง
ตัวอย่างนี้สาธิตการใช้ UNION รวมข้อมูลจากสองตาราง แล้วกรองด้วย IN() บนชุดผลลัพธ์ที่รวมแล้ว
สร้างตารางแรกและข้อมูล
mysql> create table DemoTable1 (
-> StudentId int,
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (1.24 sec)
mysql> insert into DemoTable1 values(210, 'Adam');
สร้างตารางที่สองและข้อมูล
mysql> create table DemoTable2 (
-> StudentId int,
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (0.69 sec)
mysql> insert into DemoTable2 values(100, 'Chris');
คำสั่ง UNION + IN
mysql> select StudentName from
-> (
-> select StudentId, StudentName from DemoTable1
-> UNION
-> select StudentId, StudentName from DemoTable2
-> ) tbl
-> where StudentId IN (210, 100);
ผลลัพธ์
+-------------+ | StudentName | +-------------+ | Adam | | Chris | +-------------+
อธิบายโครงสร้าง
- Subquery (derived table)
tblรวมข้อมูลจากทั้งสองตารางด้วยUNION(ลบซ้ำอัตโนมัติ) - Outer query กรองด้วย
WHERE StudentId IN (...) - เลือกเฉพาะ
StudentNameตามที่ต้องการ
UNION vs UNION ALL
UNION— ลบแถวซ้ำ (distinct) ต้อง sort/unique → ช้ากว่าUNION ALL— เก็บทุกแถว รวมซ้ำ → เร็วกว่า ใช้เมื่อแน่ใจว่าไม่ซ้ำหรือยอมรับซ้ำ
การเพิ่ม Index เพื่อประสิทธิภาพ
หากตารางใหญ่ ควรสร้าง index บน StudentId ในทั้งสองตาราง เพื่อให้ IN() และ UNION ทำงานเร็วขึ้น
กรณีซับซ้อน: UNION หลายตาราง + เงื่อนไขต่างกัน
SELECT name FROM (
SELECT id, name FROM table1 WHERE status = 'active'
UNION ALL
SELECT id, name FROM table2 WHERE type = 'premium'
UNION ALL
SELECT id, name FROM table3 WHERE verified = 1
) combined
WHERE id IN (101, 202, 303);