การหา ID ที่มีในทั้งสองตารางด้วย IN และ Subquery
ใช้ WHERE Id IN (SELECT Id FROM other_table) เพื่อหา ID ที่ปรากฏในทั้งสองตาราง (Intersection)
รูปแบบคำสั่ง
SELECT columns FROM table2
WHERE id_column IN (SELECT id_column FROM table1);
ตัวอย่าง: หา ID ที่มีใน DemoTable1 และ DemoTable2
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (Id INT);
INSERT INTO DemoTable1 VALUES (100), (110), (4), (3);
CREATE TABLE DemoTable2 (Id INT, Name VARCHAR(50));
INSERT INTO DemoTable2 VALUES (4, 'Chris'), (1, 'David'), (110, 'Adam'), (210, 'Bob');
2. ดูข้อมูลทั้งสองตาราง
SELECT * FROM DemoTable1; -- 100, 110, 4, 3
SELECT * FROM DemoTable2; -- 4, 1, 110, 210
3. หา ID ที่ซ้ำ (อยู่ในทั้ง 2 ตาราง)
SELECT Id, Name FROM DemoTable2
WHERE Id IN (SELECT Id FROM DemoTable1);
ผลลัพธ์:
+------+-------+
| Id | Name |
+------+-------+
| 110 | Adam |
| 4 | Chris |
+------+-------+
วิธีอื่น: INNER JOIN (มักเร็วกว่า)
SELECT DISTINCT d2.Id, d2.Name
FROM DemoTable2 d2
INNER JOIN DemoTable1 d1 ON d2.Id = d1.Id;
วิธีอื่น: EXISTS (มักเร็วกว่า IN กับ Subquery ขนาดใหญ่)
SELECT Id, Name FROM DemoTable2 d2
WHERE EXISTS (SELECT 1 FROM DemoTable1 d1 WHERE d1.Id = d2.Id);
การเปรียบเทียบ IN vs EXISTS vs JOIN
| วิธี | เหมาะสำหรับ | ประสิทธิภาพ |
|---|---|---|
| IN (Subquery) | Subquery เล็ก, ค่าคงที่ | ดี ปกติ |
| EXISTS | Subquery ใหญ่, Correlated | ดีมาก (Semi-join) |
| INNER JOIN | ต้องการคอลัมน์จากทั้ง 2 ตาราง | ดีมาก (Hash Join ใน MySQL 8.0+) |