מדריך SQL זה מתמקד בפקודת ה Inner Join. מדריך זה הינו חלק מרשימת פוסטים הנוגעים לפקודת ה JOIN
ב SQL SERVER. כדי להגיע לפוסטים הנוספים ניתן להעזר בקישורים הבאים :

  • שילוב טבלאות באמצעות Inner Join – בשילוב נתונים מטבלאות על סמך ערכים משותפים לשתי הטבלאות
  • שילוב טבלאות באמצעות Outer Join – מתמקד בשילוב נתונים מטבלאות תוך הצגת כל הנתונים מהטבלה האחת ללא קשר לנתונים המוצגים בטבלה האחרת.
  • שילוב טבלאות באמצעות Self Join – שילוב נתונים מאותה טבלה לעצמה.

שילוב נתונים מטבלאות שונות

לעתים, הנתונים אותם נרצה להציג נמצאים בשתי טבלאות או יותר, לדוגמא :

פקודת 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 טבלאות או יותר

image

כעת נרצה לשלב נתונים משלוש טבלאות: הצגת שם העובד מטבלת עובדים, את שם המחלקה שלו מטבלת מחלקות ואת העיר שלו מטבלת איזורים.

כדי שנוכל לשלב טבלה נוספת לשתי הטבלאות המקושרות שלנו, יש :

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

לעתים, נרצה לשלב בין שתי טבלאות אשר אין בינהן עמודה משותפת ולכאורה אף תנאי מקשר :

image

מהי דרגת השכר של משה? אמנם אין לנו עמודה משותפת, אך אנו יכולים לדעת כי הוא שייך לדרוג שכר 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

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

נערך ע”י אלעד פלג