IN เหมาะกับ Subquery ที่คืนค่า น้อย (Small Result Set)
EXISTS เหมาะกับ Subquery ที่คืนค่า มาก (Large Result Set) หรือ Correlated Subquery
ตัวอย่างใช้ IN (Subquery เล็ก)
mysql> CREATE TABLE InSubQueryDemo (PNumber INT, PName VARCHAR(100));
mysql> INSERT INTO InSubQueryDemo VALUES (1,'Laptop'),(2,'WirelessKeyboard'),(3,'WirelessMouse');
mysql> SELECT * FROM InSubQueryDemo
-> WHERE PNumber IN (SELECT PNumber FROM InSubQueryDemo WHERE PNumber > 1);
ผลลัพธ์:
+---------+------------------+ | PNumber | PName | +---------+------------------+ | 2 | WirelessKeyboard | | 3 | WirelessMouse | +---------+------------------+
ตัวอย่างใช้ EXISTS (Correlated Subquery)
-- หาลูกค้าที่มี Order อย่างน้อย 1 รายการ SELECT * FROM Customers c WHERE EXISTS (SELECT 1 FROM Orders o WHERE o.customer_id = c.id);
ตารางเปรียบเทียบ
| คุณสมบัติ | IN | EXISTS |
|---|---|---|
| Subquery Size | เล็ก (คืนค่าน้อย) | ใหญ่ (คืนค่ามาก) |
| NULL Handling | NULL ใน Subquery ทำให้ IN คืน NULL/UNKNOWN | ไม่สนใจ NULL (True/False เท่านั้น) |
| Correlated | ได้แต่ไม่แนะนำ | เหมาะที่สุด |
| Performance | Materialize Subquery ก่อน | Short-circuit (หาเจอ 1 แถวหยุด) |
กฎทั่วไป: Subquery เล็ก/Static → IN | Subquery ใหญ่/Correlated → EXISTS | NOT IN ต้องระวัง NULL → ใช้ NOT EXISTS แทน