שיעורי מודול (2/4)
שמירה על הכל בצד שמאל: LEFT JOIN
ל-INNER JOIN מהשיעור הקודם יש תופעת לוואי חשובה: זה
מפיל שורות שאין להן התאמה. אם לעובד אין מחלקה
(department_id הוא NULL), הם נעלמים מהתוצאה.
לפעמים זה מה שאתה רוצה. עם זאת, לעתים קרובות זה לא: בדוח משאבי אנוש
חיוני לראות את כל העובדים, כולל אלה ללא מחלקה,
ולדעת מי הם. בשביל זה נועד LEFT JOIN (במלואו, LEFT OUTER JOIN).
איך זה עובד
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. כל השורות שלו שורדות, תמיד.
-- 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 על עמודה של
הטבלה הימנית תמצא בדיוק את השורות ללא התאמה:
-- 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;הטריק הזה משמש כל הזמן בעולם האמיתי: "מצא לי הזמנות עם לא לקוח", "מוצרים ללא ביקורות", "משתמשים שמעולם לא נרשמו ב".
נסה את זה
החזר שם פרטי (שם_שם) ושם משפחה (שם_משפחה) של עובדים שלא הוקצה להם מחלקה. שורה אחת או יותר, שתי עמודות.
הצג רמז
השלם את ה-WHERE עם d.id IS NULL - אתה רוצה את השורות שבהן ה-LEFT JOIN לא מצא מחלקה תואמת.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
רשום את כל המחלקות (departments.name) ולצידן את מספר העובדים, כולל מחלקות ללא עובדים (הצג 0 עבור אלה). רמז: התחל ממחלקות ועשה LEFT JOIN עם העובדים, ואז GROUP BY + COUNT.
הצג רמז
השתמש ב-COUNT(e.id) (לא ב-COUNT(*)) כדי לספור 0 כאשר אין התאמה: COUNT(*) יספור 1 בגלל שורת ה-LEFT JOIN עם NULL.
הפתרון זמין לאחר 3 ניסיונות