מדריך SQL זה מתמקד בפקודת ה Inner Join. מדריך זה הינו חלק מרשימת פוסטים הנוגעים לפקודת ה JOIN
ב SQL SERVER. כדי להגיע לפוסטים הנוספים ניתן להעזר בקישורים הבאים :
- שילוב טבלאות באמצעות Inner Join – בשילוב נתונים מטבלאות על סמך ערכים משותפים לשתי הטבלאות
- שילוב טבלאות באמצעות Outer Join – מתמקד בשילוב נתונים מטבלאות תוך הצגת כל הנתונים מהטבלה האחת ללא קשר לנתונים המוצגים בטבלה האחרת.
- שילוב טבלאות באמצעות Self Join – שילוב נתונים מאותה טבלה לעצמה.
שילוב נתונים מטבלאות שונות
לעתים, הנתונים אותם נרצה להציג נמצאים בשתי טבלאות או יותר, לדוגמא :
שני עקרונות חשובים לשילוב בין טבלאות:
v על מנת לקשר בין שתי טבלאות או יותר יש צורך בערכים משותפים (מספר מחלקה בדוגמא זו) או קשר הגיוני מסויים.
v על מנת לקשר בין שתי טבלאות יש צורך להחליט על תנאי הקישור. בדוגמא שהוצגה הקשר היה על סמך השוואה (אם מספר המחלקה בטבלת מחלקות שווה למספר המחלקה בטבלת עובדים הרי שהעובד שייך למחלקה זו).
מכפלה קרטזית – כל הצירופים האפשריים, שילוב כל הקומבינציות האפשריות משתי טבלאות או יותר. מכפלה קרטזית לרוב מתרחשת כתוצאה מפעולת השוואה לא נכונה או קשר לוגי שגוי בין העמודות.
Equi Join – שילוב 2 טבלאות
Equi – מלשון Equal, משום שהשילוב נעשה על סמך אופרציית השוואה.
SELECT שם_עמודה.שם_טבלה_א , שם_עמודה.שם_טבלה_ב , שם_עמודה.שם_טבלה_ב … FROM שם_טבלה_א JOIN שם_טבלה_ב ON שם_עמודה.שם_טבלה_א = שם_עמודה.שם_טבלה_ב
לדוגמא, אנו רוצים לשלב נתונים מטבלת Employees וטבלת Departments, להציג את שם משפחת העובד ומשכורתו מטבלת Employees ולהציג את שם המחלקה של העובד מטבלת Departments :
SELECT employees.last_name , employees.salary , departments.department_name FROM employees JOIN departments ON employees.department_id = departments.department_id
v משפט SELECT מציין את העמודות אותן אנו רוצים להציג לפי הטבלאות השונות. עמודות אלו נכתוב בפורמט של שם_עמודה.שם_טבלה.
v משפט FROM מציין את הטבלאות מהן אנו רוצים למשוך את הנתונים. במשפט זה אנו נציין את הטבלאות השונות עם מילת המפתח JOIN ביניהן.
v לאחר ציון הטבלאות תגיע המילה ON ולאחריה נציין את התנאי על פיו אנו רוצים לבצע את הקישור.
כינויים לטבלאות
כינויים לטבלאות מייעלים את נוחות הכתיבה ואת הקריאות של שאילתות JOIN. במקום לכתוב אחרי כל עמודה ועמודה שם טבלה מלא (דבר שעלול להיות מאוד ארוך ומסורבל) נשתמש בכינויים.
נבצע שוב את הדוגמא האחרונה תוך הגדרת כינויים :
SELECT emp.last_name , emp.salary , dep.department_name FROM employees emp JOIN departments dep ON emp.department_id = dep.department_id
v את הכינויים לטבלאות נגדיר במשפט FROM.
v לאחר כל שם טבלה נכתוב כינוי.
v ניתן לכנות טבלה בכל שם שנבחר (למשל, לכנות את טבלת Employees באות A), אך רצוי שלכינויים תהיה משמעות.
v לאחר שנגדיר כינוי לטבלה, פורמט כתיבת שם העמודה יהיה :
שם_עמודה.כינוי_שם_טבלה
v לאחר שנגדיר את הכינויים לטבלאות, לא יהיה ניתן להשתמש בפורמט העמודה הקודם : שם_עמודה.שם_טבלה
v הצורה המקובלת לכתיבת JOIN בין טבלאות היא תמיד ע"י השימוש בכינויים לטבלאות. מעתה, יתר הדוגמאות תהיינה עם כינויים לטבלאות.
הוספת משפטי SQL שונים לאחר משפט JOIN
לאחר שסיימנו להשתמש בפקודת JOIN על מנת לקשר בין הטבלאות, ניתן להמשיך ולכתוב את משפט ה– SQL בכל צורה שנרצה (להוסיף עוד תנאי, לשנות את סדר המיון וכדומה). רק חשוב להמשיך ולהקפיד על מבנה העמודה : שם_עמודה.כינוי_שם_טבלה.
להלן מספר דוגמאות :
ניתן להוסיף עוד תנאי – להציג את השילוב רק עבור העובדים אשר נמצאים במחלקה מספר 90 :
SELECT emp.last_name , emp.salary , dep.department_name FROM employees emp JOIN departments dep ON emp.department_id = dep.department_id WHERE emp.department_id = 90
ניתן לשנות את סדר המיון – להציג את הנתונים בצורה ממויינת לפי שכר העובד :
SELECT emp.last_name , emp.salary , dep.department_name FROM employees emp JOIN departments dep ON emp.department_id = dep.department_id WHERE emp.department_id = 90 ORDER BY emp.salary DESC
Equi Join – שילוב 3 טבלאות או יותר
כעת נרצה לשלב נתונים משלוש טבלאות: הצגת שם העובד מטבלת עובדים, את שם המחלקה שלו מטבלת מחלקות ואת העיר שלו מטבלת איזורים.
כדי שנוכל לשלב טבלה נוספת לשתי הטבלאות המקושרות שלנו, יש :
v להוסיף את שם הטבלה במשפט FROM (ע"י שימוש ב– JOIN נוסף).
v למצוא ולכתוב את התנאי המקשר הנוסף במשפט ON.
SELECT emp.last_name , emp.salary , dep.department_name , loc.city FROM employees emp JOIN departments dep ON emp.department_id = dep.department_id JOIN locations loc ON dep.location_id = loc.location_id
v אותו רעיון חל גם על שילוב ארבע טבלאות או יותר – הוספת שם הטבלה במשפט JOIN וכתיבת התנאי המקשר הנוסף במשפט ON.
v על כל X טבלאות אנו צריכים X-1 תנאים לקישור.
Non Equi Join
לעתים, נרצה לשלב בין שתי טבלאות אשר אין בינהן עמודה משותפת ולכאורה אף תנאי מקשר :
מהי דרגת השכר של משה? אמנם אין לנו עמודה משותפת, אך אנו יכולים לדעת כי הוא שייך לדרוג שכר A, משום שהשוונו את שכרו לנתונים בטבלת דרוג השכר וראינו שהוא נמצא בין 500 ל 2000.
כדי לבצע את השילוב בין שתי טבלאות אלו נשתמש באופרציית BETWEEN :
SELECT emp.last_name , emp.salary , job.grade_level FROM employees emp JOIN job_grades job ON emp.salary BETWEEN job.lowest_sal AND job.highest_sal
שילוב בין כל שתי טבלאות (או יותר) הוא אפשרי כל עוד אנו מוצאים תנאי הגיוני כלשהו אשר יקשר את הטבלאות יחדיו.
נערך ע”י אלעד פלג