תוֹכֶן
אתגר מתמיד בשימוש ב- SQL קובע את השימוש הנכון של מפעילי EXISTS ו- IN. שני המפעילים יכולים לייצר את אותן תוצאות, אך לא תמיד. בנוסף, יש דיון רב על איך כל מפעיל הוא מותאם למהירות. המשתמשים צריכים להבין את התכונות השונות של כל מפעיל ולנסות את השניים כדי לקבוע את השימוש המתאים.
שקול את מטרות SQL בעת בחירת EXISTS או IN (Jupiterimages / Photos.com / Getty Images)
IN
אופרטור IN מחזיר שורה אם ערך השדה של טבלה עונה על תנאי WHERE ברשימה של ערכי IN. הוא משמש בדרך כלל כחלק משאילתה מרכזית או בשילוב עם שאילתת משנה.
דוגמה 1: WHERE table.field IN ('a', 'b', 'c') דוגמה 2: WHERE table.field IN (שאילתת משנה המחזירה קבוצה)
מפעיל EXISTS
מפעיל EXISTS מחזיר את כל השורות הגדולות אם שאילתת משנה מכילה שורות. הוא משמש רק בשילוב עם שאילתת משנה. השורות שהוחזרו נקבעות על ידי המסנן בשאילתה הראשית.
דוגמה: כאשר קיימים (שאילתת משנה המחזירה קבוצה)
הבדל
מפעיל ה- IN אינו יכול להעריך ערכים NULL, ולכן שורות כאלה תמיד יהיו שגויות ולא יוחזרו, בניגוד למפעיל EXIS, אשר מעריך ומחזיר שורות עם ערכי NULL.
דמיון
הן EXISTS והן IN תומכים בשאילתות משנה מתואמות ובלתי מתואמות, ושניהם יכולים להפיק תוצאות דומות. כאשר מתואמים, הם מספקים שדה שאילתה ראשי עבור שדה שאילתת משנה (לדוגמה: principal.id = subquery.id). שאילתת המשנה מעריכה שורה אחר שורה, עבור כל התרחשות שנמצאה. במקרה זה, IN ו- EXISTS יחזירו את אותם הקווים על בסיס תנאים "זהות" דומים. כאשר לא מתואמים, שני המפעילים מעבדים את שאילתות המשנה שלהם ולאחר מכן משלבים את התוצאות עבור השאילתה הראשית.
ביצועים
הביצועים נקבעים על ידי האופטימיזציה של מסד הנתונים ותוכנית הביצוע המשמשת לקוד המתבצע. עבור EXISTS ו- IN, האופטימיזציה יכולה לבחור נתיבים שונים. ב- Oracle, לא EXISTS הוא בדרך כלל מהיר יותר מאשר לא. בסופו של דבר, כמה ניסיונות וטעויות נדרשים למיין את הנתיב הקצר ביותר, בהתאם למסד הנתונים ואת הגירסה בשימוש. הקפד להשתמש במפעיל אשר מבטיח את התוצאות הנכונות הראשון, ולאחר מכן לנסות להחליף את המפעילים לראות המהיר ביותר.