דילוג לתוכן המרכזי
מודול 3 · שיעור 1 מתוך 49/57 בקורס~12 min
שיעורי מודול (1/4)

צירוף שני שולחנות: INNER JOIN

עד עכשיו קראנו טבלה אחת בכל פעם. בעולם האמיתי, לעומת זאת, נתונים כן מפוזר על פני טבלאות קשורות מרובות: במערך הנתונים שלנו, לדוגמה, כל אחת מהן לעובד יש department_id שמפנה לטבלה departments. לראות את שם המחלקה (ולא רק id שלה) אנחנו צריכים להצטרף ל- שני שולחנות. האופרטור שעושה זאת נקרא JOIN.

התחביר הבסיסי

SQL
SELECT columns
FROM   table_a
JOIN   table_b ON table_a.x = table_b.y;

קרא באנגלית: "קח table_a, צרף אליו table_b על ידי התאמה של כל שורה שבה table_a.x שווה ל-table_b.y". התוצאה היא ווירטואלי חדש טבלה עם העמודות של שניהם.

SQL
-- For each employee, also show the name of their department:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

החלק שאחרי ON נקרא תנאי החיבור: זה מה שאומר את מנוע "שתי השורות האלה הן בערך אותו הדבר, יש להתאים אותן". ב- רוב המכריע של המקרים זה שוויון בין מפתח ראשי לזר מפתח (כאן departments.id וemployees.department_id).

INNER JOIN, בפירוט

מילת המפתח המלאה היא INNER JOIN, אבל JOIN בפני עצמו הוא הסטנדרט מילה נרדפת. "פנימי" פירושו שרק השורות שיש להן התאמה בשתי טבלאות מוחזרות:

  • אם לעובד יש department_id = NULL, הם לא יופיעו ב- תוצאה;
  • אם למחלקה אין עובדים, זה לא יופיע בתוצאה.

שמות עמודות מתאימים

כאשר לשתי טבלאות יש עמודות עם אותו שם (כאן לשתיהן יש id, וכן לשניהם יש name אם אתה חושב על זה), אתה צריך לציין איזו טבלה עמודה מגיעה מכתיבת table.column. כדי להימנע מלחזור על שמות ארוכים, לעתים קרובות נעשה שימוש בכינויים (ראית אותם במודול 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS הוא אופציונלי גם כאן: FROM employees e פועל אותו הדבר.

נסה את זה

פעילות גופנית#sql.m3.l1.e1
ניסיונות: 0טוען...

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

טוען עורך...
הצג רמז

השלם את תנאי ה-ON עם השוויון בין e.department_id ל-d.id, ולאחר מכן בחר d.city בתור העמודה השלישית.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m3.l1.e2
ניסיונות: 0טוען...

רשימת שם פרטי (שם_שם) ושם משפחה (שם_משפחה) של כל העובדים שעובדים במחלקה שבסיסה במילאנו. סנן על departements.city, לא על שם המחלקה.

טוען עורך...
הצג רמז

אותו JOIN כמו התרגיל הקודם, אבל סנן על d.city = 'Milano' במקום על שם המחלקה.

הפתרון זמין לאחר 3 ניסיונות