הבדלים בין EXISTS ו- IN ב- SQL

שקול את מטרות SQL בעת בחירת EXISTS או IN.

מפעיל ב

מפעיל ה- IN מחזיר שורה אם ערך הטבלה, כאשר השדה המותאם תואם לרשימה של ערכי IN. IN משמש בדרך כלל כחלק משאילתה מרכזית או יחד עם שאילתת משנה. דוגמא 1: WHERE טבלה: אחזור ('a', 'b', 'c') דוגמה 2: כאשר Table.Field (קבוצת ערכים המוחזרים על ידי שאילתת המשנה)

מפעיל המפעיל

מפעיל ה- EXISTS מחזיר את כל שורות השאילתה הראשיות אם שאילתת המשנה מכילה שורות. EXISTS משמש רק בשילוב עם שאילתת משנה. השורות המוחזרות נקבעות על ידי סינון ברמת השאילתה הראשית. דוגמה: כאשר קיימים (קבוצת ערכי החזרה של שאילתת המשנה)

הבדל

IN לא יכול להעריך NULLs, ולכן השורות תמיד שגויות, והן אינן מוחזרות. EXISTS יכול להעריך NULL, כך שורות ניתן להחזיר.

דמיון

EXISTS ו- IN הן תת שאילתות משנה מתואמות ובלתי מתואמות, ושניהם יכולים להפיק תוצאות מרכזיות דומות. כאשר מתואמים, EXISTS ו- IN מתאימים לשדה שאילתה ראשי עם שדה שאילתת משנה (לדוגמה: main.id = subquery.id). שאילתת המשנה מוערכת שורה אחר שורה, עבור כל התאמה שנמצאה. במקרה זה, IN ו- EXISTS יחזירו את אותן השורות על סמך זיהוי דומה. כאשר הם אינם מתואמים, EXISTS ו- IN מעבירים את שאילתות המשנה שלהם תחילה ולאחר מכן מתאימים את התוצאות לשאילתה הראשית.

ביצועים של EXISTS ו- IN

הביצועים נקבעים על ידי כלי האופטימיזציה של מסד הנתונים ותוכנית הביצוע שהיא משתמשת בקוד שמתבצע. עבור EXISTS ו- IN, האופטימיזציה יכולה לבחור נתיבים שונים. באורקל, NO EXISTS מונע אנטי-הצטרפות, ובדרך כלל מוכיח שהוא מהיר יותר מאשר NO IN. בקיצור, זה דורש קצת ניסוי וטעייה כדי לקבוע את הנתיב המהיר ביותר בהתאם למסד הנתונים ואת הגירסה בשימוש. הקפד להשתמש באופרטור המבטיח את התוצאות הנכונות, אם כי בכל זאת, מנסה להחליף EXISTS ו- IN כדי לראות איזה מהם הוא מהיר יותר.