ใช้ IN() แทน OR หลายตัวสำหรับค่าหลายค่าในคอลัมน์เดียว
IN(value1, value2, ...) ตรวจสอบว่าค่าคอลัมน์ตรงกับค่าใดค่าหนึ่งในรายการ เขียนสั้นกว่าและอ่านง่ายกว่า col = v1 OR col = v2 OR ...
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (Id INT, Name VARCHAR(100)); INSERT INTO DemoTable VALUES (10, 'John'), (59, 'Carol'), (20, 'Sam'), (45, 'David');
ข้อมูลในตาราง
+------+-------+ | Id | Name | +------+-------+ | 10 | John | | 59 | Carol | | 20 | Sam | | 45 | David | +------+-------+
คำสั่งค้นหา Id = 59 หรือ 45
SELECT * FROM DemoTable WHERE Id IN (59, 45);
ผลลัพธ์
+------+-------+ | Id | Name | +------+-------+ | 59 | Carol | | 45 | David | +------+-------+
คำอธิบาย: Id IN (59, 45) เทียบเท่า Id = 59 OR Id = 45
ประโยชน์ของ IN():
- อ่านง่าย กระชับ
- Optimizer จัดการได้ดี (แปลงเป็น Range Scan หรือ IN-to-EXISTS)
- รองรับ Subquery:
WHERE Id IN (SELECT Id FROM OtherTable WHERE ...) - รองรับ Tuple:
WHERE (col1, col2) IN ((1,'a'), (2,'b'))
⚠ ข้อจำกัด: รายการใน IN() ควรไม่เกินพันๆ รายการ (Limits: max_allowed_packet, optimizer_switch) หากมากเกินไป ควรใช้ JOIN กับ Temp Table/Derived Table แทน
NOT IN: WHERE Id NOT IN (59, 45) หาค่าที่ไม่อยู่ในรายการ (ระวัง NULL ใน Subquery)