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

MySQL: EXISTS vs IN ใน Subquery ควรใช้ตัวไหน?

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);

ตารางเปรียบเทียบ

คุณสมบัติINEXISTS
Subquery Sizeเล็ก (คืนค่าน้อย)ใหญ่ (คืนค่ามาก)
NULL HandlingNULL ใน Subquery ทำให้ IN คืน NULL/UNKNOWNไม่สนใจ NULL (True/False เท่านั้น)
Correlatedได้แต่ไม่แนะนำเหมาะที่สุด
PerformanceMaterialize Subquery ก่อนShort-circuit (หาเจอ 1 แถวหยุด)
กฎทั่วไป: Subquery เล็ก/Static → IN | Subquery ใหญ่/Correlated → EXISTS | NOT IN ต้องระวัง NULL → ใช้ NOT EXISTS แทน