Join (SQL)

ב-SQL, Join היא פסקה (חלק משאילתא) לאיחוד שדות בין שתי טבלאות על ידי ערכים המשותפים לשתיהן.

תקן ה-ANSI ל-SQL מגדיר ארבעה סוגים של איחוד: פנימי (Inner), חיצוני (Outer), ימינה (Right) ושמאלה (Left).
על המתכנת לכתוב פרדיקט עבור האיחוד כדי לזהות את הרשומות שיש לאחד. ברשומות בהן הפרדיקט חיובי, הרשומה מתאחדת לטבלת התוצאה בהתאם לפורמט.

איחוד פנימי (Inner Join) הוא האיחוד הנפוץ ביותר ביישומים ומשתמשים בו בדרך כלל בתור איחוד ברירת מחדל. איחוד פנימי יוצר טבלה חדשה על ידי שילוב שדות של שתי טבלאות המבוסס על פרדיקט האיחוד.

פעולת Join מקבילה במידה מסוימת למכפלה קרטזית בתורת הקבוצות - התוצאה היא תת-קבוצה מסוימת של הטבלה של "כל הזוגות הסדורים של שורה מהטבלה הראשונה ושורה מהטבלה השנייה".

== דוגמאות ==
עבור הטבלאות:
{|
|- valign="top"
|
{| class="wikitable" style="text-align:center;margin-right:5px"
|+Employee 
|-
! LastName !! DepartmentID
|-
| Rafferty ||31
|-
| Jones || 33
|-
| Steinberg || 33
|-
| Robinson || 34 
|-
| Smith|| 34
|-
| John || NULL
|}
|
{| class="wikitable" style="text-align:center;margin-left:5px"
|+Department 
|-
! DepartmentID !! DepartmentName
|-
| 31 || Sales 
|-
| 33 || Engineering
|-
| 34 || Clerical
|-
| 35 || Marketing
|}
|}

בדוגמאות הללו פרדיקט האיחוד ידרוש תמיד שוויון בין שדה DepartmentID של הטבלה הראשונה לזה של הטבלה השנייה, אחרת נקבל גם רשומות שלא מעניינות אותנו, כגון: 
{| class="wikitable" style="text-align:center;margin-left:5px"
|-
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
|-
| Robinson || 34 || Engineering || 33
|-
|}

=== Inner join ===

{| class="wikitable" style="direction:ltr;text-align:center"
! colspan="4" | <syntaxhighlight lang="sql">
SELECT *
FROM employee 
 INNER JOIN department 
 USING (DepartmentID);
</syntaxhighlight>
|-
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
|-
| Robinson || 34 || Clerical || 34
|-
| Jones || 33 || Engineering || 33
|-
| Smith || 34 || Clerical || 34
|-
| Steinberg || 33 || Engineering || 33
|-
| Rafferty || 31 || Sales || 31
|-
|}
=== Left outer join ===
התוצאה של איחוד עם left outer join (או בקיצור left join) עבור טבלאות A ו-B תכיל תמיד את כל הרשומות מהטבלה ה"שמאלית", אף אם תנאי האיחוד לא מוצא כל רשומה מתאימה בטבלה ה"ימנית" (B).

{| class="wikitable" style="direction:ltr;text-align:center"
! colspan="4" | <syntaxhighlight lang="sql">
SELECT * 
FROM employee LEFT OUTER JOIN department 
 ON employee.DepartmentID = department.DepartmentID;
</syntaxhighlight>
|-
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
|-
| Jones || 33 || Engineering || 33
|-
| Rafferty || 31 || Sales || 31
|-
| Robinson || 34 || Clerical || 34
|-
| Smith || 34 || Clerical || 34
|-
| John || NULL || NULL || NULL
|-
| Steinberg || 33 || Engineering || 33
|}

=== Right outer join ===
דומה ל־Left outer join אך בכיוון ההפוך.
{| class="wikitable" style="direction:ltr;text-align:center"
! colspan="4" | <syntaxhighlight lang="sql">
SELECT * 
FROM employee RIGHT OUTER JOIN department 
 ON employee.DepartmentID = department.DepartmentID;
</syntaxhighlight>
|-
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
|-
| Smith || 34 || Clerical || 34
|-
| Jones || 33 || Engineering || 33
|-
| Robinson || 34 || Clerical || 34
|-
| Steinberg || 33 || Engineering || 33
|-
| Rafferty || 31 || Sales || 31
|-
| NULL || NULL || Marketing || 35
|}

== קישורים חיצוניים ==
* [https://web.archive.org/web/20150101091354/http://ramkedem.com/2014/12/01/%D7%9E%D7%93%D7%A8%D7%99%D7%9A-sql-server-sql-%D7%A4%D7%A7%D7%95%D7%93%D7%AA-inner-join/ מדריך לשפת SQL - רם קדם]

קטגוריה:מסדי נתונים