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

שמירה על הכל בצד שמאל: LEFT JOIN

ל-INNER JOIN מהשיעור הקודם יש תופעת לוואי חשובה: זה מפיל שורות שאין להן התאמה. אם לעובד אין מחלקה (department_id הוא NULL), הם נעלמים מהתוצאה.

לפעמים זה מה שאתה רוצה. עם זאת, לעתים קרובות זה לא: בדוח משאבי אנוש חיוני לראות את כל העובדים, כולל אלה ללא מחלקה, ולדעת מי הם. בשביל זה נועד LEFT JOIN (במלואו, LEFT OUTER JOIN).

איך זה עובד

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

קרא באנגלית: "שמור את כל השורות של table_a; עבור כל אחת נסה צרף שורה מ-table_b; אם אין התאמה, מלא את העמודות מ table_b עם NULL".

מילת המפתח היא LEFT: פירושה "שולחן שמאל", כלומר זה שנכתב לאחר FROM. כל השורות שלו שורדות, תמיד.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

במערך הנתונים שלנו שאילתה זו מחזירה 10 שורות (עובד אחד כל אחת). אנדריאה קוסטה, שיש לו department_id = NULL, מופיע עם dipartimento = NULL במקום להיעלם.

מציאת שורות "אין התאמה".

תוצאה שימושית מאוד: על ידי סינון עם IS NULL על עמודה של הטבלה הימנית תמצא בדיוק את השורות ללא התאמה:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

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

נסה את זה

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

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

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

השלם את ה-WHERE עם d.id IS NULL - אתה רוצה את השורות שבהן ה-LEFT JOIN לא מצא מחלקה תואמת.

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

סקירת התרגיל

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

רשום את כל המחלקות (departments.name) ולצידן את מספר העובדים, כולל מחלקות ללא עובדים (הצג 0 עבור אלה). רמז: התחל ממחלקות ועשה LEFT JOIN עם העובדים, ואז GROUP BY + COUNT.

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

השתמש ב-COUNT(e.id) (לא ב-COUNT(*)) כדי לספור 0 כאשר אין התאמה: COUNT(*) יספור 1 בגלל שורת ה-LEFT JOIN עם NULL.

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