PracticU

החזרת מידע ממספר טבלאות
JOIN

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › החזרת מידע ממספר טבלאות JOIN
מילון מושגים:
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
Join - פעולת SQL שמשלבת שורות משתי טבלאות או יותר על בסיס קשר ביניהן.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.

החזרת מידע ממספר טבלאות JOIN
כשהמידע שרוצים להציג נמצא בכמה טבלאות, משתמשים ב-Join. הדוגמה: בטבלת Products יש רק CategoryID, והשם של הקטגוריה נמצא בטבלת Categories. ההרצאה עוברת על סוגי ה-join ועל חיבור שלוש טבלאות.
השלבים העיקריים
1. הבעיה: Select CategoryName מתוך Products נותן שגיאת invalid column name, כי העמודה לא קיימת בטבלה הזאת. SQL מחזירה תמיד טבלה אחת, ולכן צריך לחבר את שתי הטבלאות.
2. Join עם On: From Products Join Categories On Products.CategoryID = Categories.CategoryID. המערכת לא מחברת לפי הקשר בין הטבלאות מעצמה. צריך לומר לה לפי איזה עמודות להשוות.
3. עמודה דו-משמעית: CategoryID קיימת בשתי הטבלאות, ולכן אם מציגים אותה צריך לציין מאיפה, למשל Categories.CategoryID, אחרת מתקבלת שגיאת ambiguous.
4. כינויי טבלאות: נותנים p ל-Products ו-c ל-Categories. אחרי שנתנו כינוי חייבים להשתמש בו בכל השאילתה.
5. Inner Join: Join ו-Inner Join זהים. בניסוי נוסף מוצר בלי קטגוריה וקטגוריה בלי מוצרים, ו-inner join המשיך להחזיר 77 רשומות, כי הוא מציג רק שורות שיש להן התאמה בשני הצדדים.
6. Left Join: מחזיר את כל הרשומות מהטבלה שמשמאל, גם בלי התאמה. מתקבלות 78 רשומות, והמוצר החדש מוצג עם NULL בשם הקטגוריה.
7. Right Join: מחזיר את כל הרשומות מהטבלה שמימין. הקטגוריה החדשה (Pastry) מופיעה בלי מוצר.
8. Full Join (או Full Outer Join): מחזיר הכל משני הצדדים, ובדוגמה התקבלו 79 רשומות.
9. שלוש טבלאות: Join תמיד בין שתי טבלאות, אבל אפשר לשרשר כמה. מוסיפים Join Suppliers As s On p.SupplierID = s.SupplierID כדי להציג גם CompanyName של הספק, ושורות התוצאה תואמות לנתונים בטבלאות.
שימו לב
- בניסוי הוספו שורות לטבלאות (מוצר בשם פלאפל עם CategoryID ב-NULL, וקטגוריה Pastry) רק כדי להדגים את ההבדלים.
- הפעולה על המסד נעשתה ידנית דרך עריכת הטבלה.
אחרי ההרצאה אפשר להציג בשאילתה אחת נתונים מכמה טבלאות ולבחור איזה סוג join מתאים: רק התאמות, או גם שורות בלי התאמה מצד אחד או משני הצדדים.
השיעור הבא בקורס: הוספת רשומות חדשות ב-SQL

פרקי ההרצאה: החזרת מידע ממספר טבלאות JOIN

  1. 00:00

    הצורך במידע ממספר טבלאות

  2. 01:00

    הצגת שם הקטגוריה במקום קוד

  3. 01:35

    שימוש בפקודת JOIN

  4. 03:13

    קישור טבלאות עם ON

  5. 04:31

    עמודה דו-משמעית בין טבלאות

  6. 05:25

    מתן כינויים לטבלאות

  7. 06:21

    ניסוי הוספת מוצר ללא קטגוריה

תמלול ההרצאה: החזרת מידע ממספר טבלאות JOIN

הטקסט המלא של הדקות הראשונות בהרצאה «החזרת מידע ממספר טבלאות JOIN» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:14

    בואו ננסה לבצע את הדבר הבא. Select Product Name Unit Price From Products. זה יביא לנו שם של המוצר ואת המחיר מטבלת המוצרים.

  3. 00:26

    אחד הדברים הנוספים שיש בטבלת המוצרים זה Category ID. יש לנו פה את הקוד של הקטגוריה אפשר כמובן לראות את זה פה בטבלת המוצרים יש לנו את השם של המוצר יש לנו פה את המחיר שלו והנה כאן יש את הקטגוריה שהמוצר משויך אליה צ'אי הקטגוריה שלו זה אחד אבל מה זה אחד אם אני הולך לקטגוריז ואני מסתכל אני רואה שקטגורי מספר אחד יש לה שם וזה משקה בברידג'

  4. 00:57

    מה קורה אם אנחנו רוצים לחזור ולהציג פה את השם של הקטגוריה? הרי אנחנו לא רוצים להחזיר ליוזר רק איי-דיז, אין בעיה להחזיר איי-דיז, אבל אנחנו רוצים לפעמים להציג גם את השמות של הדברים.

  5. 01:13

    אז במקום קטגורי איי-דיז, מה קורה אם אני רוצה להציג קטגורי name, את השם של הקטגוריה? כבר אנחנו מקבלים פה איזושהי שגיאה, ובאמת אם אנחנו נריץ את זה invalid column name, קטגורי name מפני שבטבלת המוצרים אין קטגורי name זה נמצא בטבלת ה-categories אם אני אבצע את זה אני אחטוף עכשיו שגיאות על שני החבר'ה

  6. 01:35

    האלה מפני ש-product name ו-unit price לא נמצאים בקטגורי אז אנחנו בעצם רוצים להביא את המידע גם מהמוצרים וגם מהקטגוריות איך עושים את זה בואו נשים פה ומה שאנחנו צריכים זה פשוט פקודת join עם categories.

  7. 01:55

    ברגע שנעשה את הדבר הזה כבר אני רואה שקיבלתי פה איזושהי שגיאה מפני שהמערכת עדיין לא יודעת לפי מה לשייך את הcategory name לproduct name ולunit price. בואו רגע נבין מה זה אומר.

  8. 02:15

    אנחנו בסופו של דבר שפת sql מחזירה לנו טבלה אחת לא משנה איזה שאילתה אתם עושים תמיד חוזרת טבלה אם אנחנו מחזירים בטבלה את השם של המוצר ואת המחיר עבור צ'אי שעולה 18 אנחנו רוצים לראות פה את השם של הקטגוריה אתם יכולים להגיד אוקיי קטגורי D זה אחד,

  9. 02:43

    אז יש לנו איזשהו ריליישן בין הטבלאות, ובאמת קיים ריליישן, אז למה המערכת לא יכולה פשוט ללכת לפי הריליישן ולראות אה, זה קטגורי אחד?

  10. 02:54

    אז בטבלת הקטגוריז, קטגורי אחד זה בבראדג', השם שלה, אז שפשוט תשים פה בבראדג'. המערכת לא עושה את זה by default, שפת SQL לא יודעת לעשות את זה, אנחנו צריכים לומר לה לפי מה לבצע את החיבור או את הקישור הזה.

  11. 03:13

    לפי מה לחפש אחד פה ולגשת ולראות שזה האחד כאן ואז לשים את ה-barage. זה מתבצע על ידי פקודה שנקראת on ואנחנו צריכים להגיד בטבלת product יושבת עמודה בשם category ID. נא לבצע השוואה בינה לבין עמודה Categories שנקראת Category ID. זה משלים לנו את הפקודה אם אנחנו נריץ את זה אנחנו

  12. 03:43

    נראה צ'אי שעולה שמונה עשרה וזה בברידג' צ'אנג עולה תשע עשרה וזה בברידג' הסירופ הזה עולה עשר וזה קונדימנס יש לנו פה את פקודת on שאנחנו מחליטים עבורה מה לבצע מבחינת ההשוואות שוב מה המערכת עשתה פרודקט ניים ויוניט פרייס נלקחו מפרודקטס Category name ניקח מקטגוריז זה בסדר אין לנו בעיה עם השמות אבל רק בשביל שהמערכת תדע

  13. 04:13

    שצ'אי יש לו קטגורי אחד. קטגורי אחד זה בבראדג' ולכן עבור צ'אי צריך להציג את הבבראדג' היינו צריכים לומר למערכת לבצע את ההשוואה לפי עמודת קטגורי ID שנמצאת בשתי הטבלאות.

  14. 04:33

    גם בפרודקטס יש קטגורי ID וגם בקטגוריז יש קטגורי ID. מה קורה אם אנחנו רוצים לראות, בואו נעשה את זה בנפרד, גם את קטגורי ID? לא יודע למה, בא לי לראות את קטגורי ID. קטגורי ID נמצאת בשתי הטבלאות וזאת בדיוק הבעיה.

  15. 04:51

    המערכת אומרת לי, רגע רגע, אמביגיוס, אמביגיוס זה משהו שהוא יש לו דו משמעות, אני לא יודע מאיפה לקחת את הקטגורי ID. אז אז אנחנו צריכים לומר לו פה מאיפה לקחת, לדוגמה מטבלת categories.categoryid ואז הוא יודע מאיזה טבלה להביא ולהציג.

  16. 05:10

    זאת אומרת שאם העמודה משוכפלת בין שתי הטבלאות אנחנו חייבים להגיד למערכת מאיזו טבלה להביא את העמודה. עכשיו אנחנו מתחילים לראות שלפעמים אנחנו מציגים too much את השם של הטבלאות categories, products.

  17. 05:25

    כאן אפשר לתת כינוי, בדרך כלל הכינוי יהיה אות אחת. לדוגמה נתתי כינוי לפרודקטס p וכינוי לקטגוריז c ואז ברגע שנתנו כינויים אנחנו מחויבים להשתמש עם הכינויים אז במקום פרודקטס אנחנו משתמשים בפי במקום קטגוריז אנחנו משתמשים בסי גם אם זה מופיע לפני הכינוי זה כינויים לטבלאות והנה קיבלנו את אותו

  18. 05:51

    הדבר זאת בעצם פקודת ג'וינט עכשיו בואו נעשה איזשהו ניסוי מעניין בואו באמת ניקח את פקודת הג'וין הפשוטה, ניקח את הפקודה הזאת, כן ניתן פה כינויים כי זה קצת יותר אלגנטי כזה, אז C ויש לנו פה פרודקטס, במקום פרודקטס יש לנו P, במקום קטגורייטס יש לנו C, אם אני אריץ את זה אז אני אקבל שם מוצר,

  19. 06:19

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

  20. 06:33

    אז אני אגש לטבלת המוצרים ואני אוסיף פה מוצר, בוא נניח פלפל ואני אגיד שהוא עולה, בוא נניח 20. אנטר.

  21. 06:44

    אבל בכוונה לא הוספתי קוד קטגוריה למוצר הזה. אנחנו רואים שיש לנו פה מספר 78, זה הקוד של המוצר, פרודקט איי-די, כי זה מוצר חדש, אבל בכוונה השארתי נ"ל את קטגוריה ID. כאילו אין למוצר עדיין קטגוריה, הוא לא משוייך לקטגוריה.

  22. 07:05

    עכשיו אני רוצה לעשות את הדבר ההפוך, אני רוצה ללכת ל-categories ולייצר איזושהי קטגוריה חדשה בטבלת ה-categories. והמאפה שאנחנו רוצים להוסיף, בואו נקרא לו pastry, המאכל שאנחנו רוצים להוסיף, בואו נקרא לו pastry, שזה מאפים, פייסטי, פייסטריס, מעפים טעימים.

  23. 07:27

    אז יש לנו כרגע איזושהי קטגוריה חדשה ויש לנו איזשהו מוצר חדש. מה קורה אם אני עכשיו מבצע ג'וין? הג'וין הזה פועל לפי קוד קטגוריה. המוצר החדש פלאפל לא משויך לקטגוריה והקטגוריה

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: שימוש בפקודות Union - לאיחוד מידע ב-SQL

ההרצאה הבאה: הוספת רשומות חדשות ב-SQL

הרצאות קשורות מקורסים אחרים

  • מבנה טבלאות
  • החזרת ערכים מה-Controller
  • החזרת מערך ב-JSON
  • אבטחת מידע

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI