เนื้อหา
ความท้าทายอย่างต่อเนื่องในการใช้ SQL คือการพิจารณาการใช้ EXISTS และ IN ที่เหมาะสม ผู้ประกอบการทั้งสองสามารถให้ผลลัพธ์ที่เหมือนกัน แต่ไม่เสมอไป นอกจากนี้ยังมีการถกเถียงกันอย่างมากเกี่ยวกับวิธีการปรับให้เหมาะสมกับความเร็ว ผู้ใช้ควรเข้าใจคุณลักษณะที่แตกต่างกันของผู้ให้บริการแต่ละรายและทำการทดสอบกับทั้งสองเพื่อพิจารณาการใช้งานที่เหมาะสม
พิจารณาเป้าหมาย SQL ของคุณเมื่อเลือก EXISTS หรือ IN (Jupiterimages / Photos.com / Getty Images)
ผู้ประกอบการ
ตัวดำเนินการ IN ส่งคืนแถวหากค่าฟิลด์ของตารางตรงตามเงื่อนไข WHERE ในรายการค่า IN โดยทั่วไปจะใช้เป็นส่วนหนึ่งของแบบสอบถามหลักหรือใช้ร่วมกับแบบสอบถามย่อย
ตัวอย่าง 1: WHERE table.field IN ('a', 'b', 'c') ตัวอย่างที่ 2: WHERE table.field IN (แบบสอบถามย่อยที่ส่งคืนชุด)
ผู้ประกอบการ EXISTS
ผู้ประกอบการ EXISTS ส่งกลับแถวที่สำคัญทั้งหมดถ้าแบบสอบถามย่อยมีแถวใด ๆ มันใช้ร่วมกับแบบสอบถามย่อยเท่านั้น แถวที่ส่งคืนจะถูกกำหนดโดยตัวกรองในแบบสอบถามหลัก
ตัวอย่าง: WHERE EXISTS (แบบสอบถามย่อยที่ส่งคืนชุด)
ข้อแตกต่าง
ตัวดำเนินการ IN ไม่สามารถประเมินค่า NULL ดังนั้นบรรทัดดังกล่าวจะเป็นเท็จเสมอและจะไม่ถูกส่งกลับซึ่งต่างจากตัวดำเนินการ EXISTS ซึ่งประเมินและส่งคืนบรรทัดที่มีค่า NULL
ความคล้ายคลึงกัน
ทั้ง EXISTS และ IN สนับสนุนเคียวรีย่อยที่สัมพันธ์และไม่เกี่ยวข้องและทั้งสองสามารถให้ผลลัพธ์ที่คล้ายกัน เมื่อมีความสัมพันธ์กันพวกเขาจะตอบสนองฟิลด์คิวรีหลักสำหรับฟิลด์เคียวรีย่อย (เช่น: principal.id = subquery.id) เคียวรี่ย่อยประเมินค่าทีละแถวสำหรับแต่ละเหตุการณ์ที่พบ ในกรณีนี้ IN และ EXISTS จะส่งคืนบรรทัดเดียวกันตามเงื่อนไข "id" ที่คล้ายกัน เมื่อไม่ได้เชื่อมโยงตัวดำเนินการทั้งสองจะประมวลผลคิวรีย่อยแล้วรวมผลลัพธ์สำหรับการสืบค้นหลัก
การปฏิบัติ
ประสิทธิภาพถูกกำหนดโดยเครื่องมือเพิ่มประสิทธิภาพฐานข้อมูลและแผนการดำเนินการที่ใช้สำหรับรหัสที่ดำเนินการ สำหรับ EXISTS และ IN เครื่องมือเพิ่มประสิทธิภาพสามารถเลือกเส้นทางที่แตกต่างกัน ใน Oracle ไม่ใช่ EXISTS มักจะเร็วกว่า NOT IN ในที่สุดความพยายามและข้อผิดพลาดบางอย่างจำเป็นต้องมีการเรียงลำดับเส้นทางที่สั้นที่สุดขึ้นอยู่กับฐานข้อมูลและรุ่นที่ใช้ อย่าลืมใช้โอเปอเรเตอร์ที่รับประกันผลลัพธ์ที่ถูกต้องก่อนจากนั้นลองเปลี่ยนโอเปอเรเตอร์เพื่อดูว่าอันไหนเร็วที่สุด