ความแตกต่างระหว่างตัวดำเนินการ EXISTS และ IN ใน SQL

ผู้เขียน: Peter Berry
วันที่สร้าง: 12 สิงหาคม 2021
วันที่อัปเดต: 2 พฤษภาคม 2024
Anonim
SQL: Difference Between IN and EXISTS Operator
วิดีโอ: SQL: Difference Between IN and EXISTS Operator

เนื้อหา

ความท้าทายอย่างต่อเนื่องในการใช้ 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 ในที่สุดความพยายามและข้อผิดพลาดบางอย่างจำเป็นต้องมีการเรียงลำดับเส้นทางที่สั้นที่สุดขึ้นอยู่กับฐานข้อมูลและรุ่นที่ใช้ อย่าลืมใช้โอเปอเรเตอร์ที่รับประกันผลลัพธ์ที่ถูกต้องก่อนจากนั้นลองเปลี่ยนโอเปอเรเตอร์เพื่อดูว่าอันไหนเร็วที่สุด