בולנט - דברים מיוחדים...     פרוטו - בניית אתרים

Israeli ASP Organization

ארגון ה-ASP הישראלי

מאמרים/דוגמאות קוד
קישורים
ספרות
חיפוש כללי:

חפש!
כלליHTMLASPASP.NETSQLמסדי נתוניםJavaScriptXML * XSLDHTML * CSSעיצוב וגרפיקהשרתיםComponentsפרסום ושיווקקידום אתריםקופירייטינגPHP
פרסומת
דף ראשי מדורים דרושים הרשמה למועדון אודותינו צור קשר
מיקום: מאמרים ודוגמאות קוד > SQL

SQL - Join

JOIN משמש אותנו לחיבור שדות ממספר טבלאות (שתיים או יותר) לשאילתת SQL אחת.
הצורך בפעולה שכזו בא כאשר אנו יוצרים שתי טבלאות (מכל סיבה ירוקה שהיא) ואנו רוצים לשלוף במשפט SQL אחד שדות בעלות קשר הגיוני משתי הטבלאות.

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

כידוע לאותם בני משפחה יש את אותו שם משפחה (בד"כ) ולכן במקום ליצור בטבלה אחת את השדות שם משפחה ושם פרטי, ולהכניס שתי רשומות כמו בtbl3, אוכל לעשות זאת בשתי טבלאות ואצטרך לכתוב את המילה "שמחוני" רק פעם אחת!
זה נשמע חיסכון מגוכח - אבל זו רק דוגמא, ומה אם היו לי 25,000 אחים ואחיות?
במציאות זה יכול לחסוך המון עבודה של הבנאדם ושל המחשב.

תחביר בסיסי של JOIN:

SELECT [*/list] FROM table1 INNER/RIGHT/LEFT JOIN table2 ON table1.field1 [OPERATOR] table2.field2; לצורך המאמר נשתמש בשתי טבלאות tbl1 וtbl2 והנתונים שבהן כפי שהם מופיעים בתמונה

בטבלה יש לנו את השמות שמוליק ושלמה ששניהם שמות פרטיים ששם המשפחה שלהם הוא שמחוני (id=1), יש לנו את השם הפרטי יוסי שלא ידוע מה שם משפחתו(id=3), ואת שם המשפחה ברק (id=2) שלא ידוע השיוך שלו לשם פרטי.

INNER JOIN

השימוש הנפוץ ביותר הוא בINNER JOIN אבל זה כמובן תלוי בצרכים שלך.
בעזרת INNER JOIN נוכל לבחור שדות מטבלאות שונות וזאת ע"י "חיבור" הטבלאות לשאילתה אחת.
כמובן שאיננו מחברים פיזית את הטבלאות אלא לצורך השאילתה אנו יוצרים join זמני.
מה שמבדיל את INNER JOIN מחבריו הRIGHT והLEFT הוא שINNERJOIN יציג רק היכן שהתנאי שבא לאחר ON מתקיים.

דוגמא:
אם אני רוצה לעשות JOIN בין הטבלאות tbl1 וtbl2 וליצור חיבור ביניהם על בסיס השדה ID שמשותף לשניהם, יהיה על הערכים בשדה tbl1.id ובtbl2.id להיות שווים.

SELECT * from tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.id; הפלט יהיה:

באותה מידה יכולתי לכתוב:

SELECT * from tbl1 INNER JOIN tbl2 ON tbl1.id = tbl2.booxa; אין הכרח שהשדות המקשרים יהיו בעלי אותו שם אבל כן יש הכרח שהשדות tbl1.id וtbl2.booxa הם שדות מאותו סוג.
אם אין קשר בין השדות tbl1.id וybl2.booxa ובשדות אלו אין דמיון אז השאילתה פשוט לא תחזיר רשומות.

כמו כן, היות והשדות מספריים, אוכל לכתוב:

SELECT * from tbl1 INNER JOIN tbl2 ON tbl1.id > tbl2.booxa; ואז יוחזרו הרשומות המבוקשות רק איפה שהשדה id מtbl1 גדול מהשדה booxa שבtbl2.
וכן נוכל להשתמש בכל האופרטורים המוכרים:
=, <>,<=,>=,<,>,LIKE

את אותו האפקט של שימוש בINNER JOIN ניתן להשיג ע"י בחירה של שדות מקשרים מטבלאות שונות ושימוש בWHERE:

SELECT tbl1.id,tbl2.id FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id;

RIGHT/LEFT

הRIGHT והLEFT מאוד דומים זה לזה (חוץ מהעובדה שהם הפוכים כמובן...).
דוגמא שווה אלף שקלים (או אלף מילים?!), אז ככה:

SELECT * from tbl1 RIGHT JOIN tbl2 ON tbl1.id = tbl2.id; ישלוף את כל הרשומות מtbl2 וגם את אילו ששוות לtbl2.id מtbl1.id.
גם הרשומה של "ברק" שאין לה מקביל בtbl1 נשלפה מכיוון שהשתמשנו בRIGHT ומכיוון שהטבלה tbl2 נמצאת מימין לJOIN.
הפלט יהיה:

SELECT * from tbl1 LEFT JOIN tbl2 ON tbl1.id = tbl2.id; ישלוף את כל הרשומות מtbl1 וגם את אילו ששוות לtbl1.id מtbl2.id.
גם הרשומה של "יוסי" שאין לה מקביל בtbl2 נשלפה מכיוון שהשתמשנו בLEFT ומכיוון שהטבלה tbl1 נמצאת משמאל לJOIN.
פלט יהיה:



רואים את ההבדל? זה הכל עניין של איפה מופיעה הטבלה שממנה אתה רוצה לשלוף את כל הרשומות.
אם אני רוצה לשלוף את כל הרשומות מהטבלה השנייה (שמופיעה מימין לJOIN) אז אני אשתמש בRIGHT JOIN ולהפך.

חשוב לזכור:

  • אסור ליצור JOIN בעזרת שדות שאינם מאותו סוג (טקסט, מספר שלם ארוך, מספור אוטומטי וכו).
  • INNER - כולל רשומות רק אם יש התאמה בשדות המקשרים. לא יכלול שדות אלא אם התנאי המקשר פועל לשני הצדדים.
  • LEFT - כולל את כל הרשומות של הטבלה הראשונה (שנמצאת משמאל) וגם את השדות שמתאימים לפי התנאי המקשר מהטבלה הימנית (השנייה).
  • RIGHT - כולל את כל הרשומות של הטבלה השנייה (שנמצאת מימין) וגם את השדות שמתאימים לפי התנאי המקשר מהטבלה השמאלית (הראשונה).
  • באותה מידה שהשתמשתי במשפטים מסוג SELECT במאמר הזה, יכולתי גם להשתמש במשפטי UPDATE.

בהצלחה!



         

מחבר: שמוליק שמחונירמת קושי: 1  ||  ציון: (8.35294117647059)כל הזכויות שמורות ל-IAO ©

חנות לסטלן  |   מתכונים  |   חגי ישראל  |   פורטל משחקים  |   חנויות מחשבים ו-ציוד הקפי  |   מגזין מסטול לסטלן המצוי  |   קליפרים  |   גידול צמחים פרחים  |   ספא פינוק מושלם