LEFT JOIN הסבר
במדריך SQL הקודם, למדנו על GROUP BY ואיך משתמשים בו. במדריך הבא, כחלק מתכנית קורס SQL למתחילים, נלמד הכל על:
JOIN, UNION, CASE WHEN.
תכירו, יש כל מיני סוגי JOIN:
- LEFT JOIN
- RIGHT JOIN
- INNER JOIN
- CROSS JOIN
- FULL OUTER JOIN
אם פספסתם את הבלוג הראשון ואתם מעוניינים לתרגל בbigquery של גוגל את השאלות שמופיעות בבלוג בחינם לחצו על הלינק חלק ראשון
SQL JOINS משמשים לחיבור בין טבלאות.
בגדול, הכלל הוא כזה:
אם אתם רוצים לחבר בין טבלה מסוימת לאחרת, אתם צריכים לקבוע מה סוג החיבור.
נשמע מסובך? אל תדאגו, זה בגלל שאנחנו בהתחלה.
INNER JOIN – משמש כאשר אנו רוצים את הערכים שיחזרו רק כשיש התאמה בין שתי הטבלאות.
בואו נראה דוגמא:
יש לנו טבלה שאנחנו כבר מכירים.
אנחנו רוצים לנתח את הנתונים לפי מדד של מדינות.
כרגע, יש לנו רק country_code והאמת, שאפשר לפתוח כל פעם דפדפן ולחפש מה זה אומר, אבל אנחנו יותר חכמים מזה.
אנחנו רוצים לדעת מה השם המלא של המדינה. במקרה, גילינו שיש ממש טבלה המכילה ״מפתחות״.
מעתה והלאה, נשתמש במושג ״מפתחות״, כאשר אנחנו מדברים על קישור בין טבלאות.
בדוגמא למטה נראה שתי טבלאות שונות שהמפתח המקשר בינהם הוא עמודת country_code
LEFT JOIN
לפניכם שתי טבלאות:
- table1 עם salary, country_code.
- table2 עם country_code, country.
אנחנו רוצים להוסיף ל-table1, את השם המלא של המדינה.
אם אנחנו רוצים לקבל תוצאה בה כל העמודות מטבלה אחת נשארות, ואנו נקבל את כל ההתאמות מטבלה שתיים, אשתמש ב-LEFT JOIN.
בכללי, זו אחת הצורות היעילות ביותר לשימוש ב-JOIN. למה, בעצם?
- היא דומה ל-VLOOKUP מאקסל.
- היא לא מחסירה לנו שורות מהטבלה המובילה.
SELECT table1.country_code,
country,
salary
FROM table1
LEFT JOIN table2
ON table1.country_code = table2.country_code
התוצאה שתתקבל היא חיבור בין שתי הטבלאות, מכיוון שיש התאמה מושלמת יחזרו כל השורות
שימו לב יש פה כמה דברים מאוד חשובים שצריך לשים אליהם לב!
1. מי הטבלה שמופיעה ב FROM – זו הטבלה המובילה אם נשתמש ב LEFT JOIN
אנחנו בעצם מגדירים תמיד לקחת את כל השורות מהטבלה הספציפית הזאת
במידה ויש התאמה עם table2 תחזיר את מה שמתאים
FROM table1
LEFT JOIN table2 ON table1.country_code = table2.country_code
שימו לב יש פה כמה דברים מאוד חשובים שצריך לשים אליהם לב!
2.שימו לב שלעמודת country_code נתתי את התחילית table1
למה? כי השם זהה באותם שתי טבלאות ואנחנו צריכים להגיד מאיזו טבלה להציג את הנתונים!
SELECT table1.country_code,
country,
salary
INNER JOIN
לפניכם שתי טבלאות:
- table1 עם salary, country_code.
- table2 עם country_code, country.
המטרה שלנו, היא למצוא רק את ההתאמה המלאה
רק את השורות שיש בהן התאמה בין שתי הטבלאות.
אנחנו רוצים לייבא לטבלה table1 את השם המלא של המדינה.
--option 1
SELECT table1.country_code,
country,
salary
FROM table1
INNER JOIN table2
ON table1.country_code = table2.country_code
--option 2
SELECT table1.country_code,
country,
salary
FROM table1
JOIN table2
ON table1.country_code = table2.country_code
שימו לב שהשוני בכתיבת הקוד הוא בשורה 6
שימו לב שנעלמו לנו שורות פה משתי הטבלאות,
למה?
כי inner join יסנן לי את הנתונים משתי הטבלאות!
CROSS JOIN
לפניכם, שתי טבלאות.
המטרה שלנו היא להבין מה המשמעות של פעולה זו:
SQL CROSS JOIN מתבצעת בדרך כלל על מניפולציות מורכבות יותר, ובעצם מכפילה כל שורה במספר השורות בטבלה השנייה.
דוגמא אמיתית ל CROSS JOIN
אני רוצה לזהות הודעות ספאם בוואטסאפ, איך אוכל לעשות זאת?
אם אקח את כל ההודעות ואבדוק כל אחת מול כל השאר האם מדובר באותו טקסט בהודעה אוכל לסמן את ההודעות ספאם
כמו שניתן לראות מהטבלה הודעות 1 – 3 עם אותו טקסט ולכן הם הודעות spam
מה שאנחנו בעצם צריכים לעשות זה לקחת כל הודעה ולבדוק אותה מול כל שאר ההודעות,
מה שנייצר כאן נקרא בשפה המקצועית ״מכפלה קרטזית״
ותכלס זה נראה ככה
שימו לב שבעצם כל שורה חוזרת על עצמה 4 פעמים, זו מניפולציה שמאפשרת לנו לנתח ולהבין תוצאות בצורה מדהימה כמו לזהות לדוגמא ספאמרים,
אז איך זה נראה ב sql?
שימו לב שבעצם כל שורה חוזרת על עצמה 4 פעמים, זו מניפולציה שמאפשרת לנו לנתח ולהבין תוצאות בצורה מדהימה כמו לזהות לדוגמא ספאמרים,
אז איך זה נראה ב sql?
SELECT a.*,
b.*
FROM messages AS a
CROSS JOIN messages as b
ORDER BY a.message_id
אם אתם רוצים לדעת באמת איך הייתי מזהה את הספאמרים?
אז הייתי רושם את השאילתא הבאה
SELECT DISTINCT a.*
FROM messages AS a
CROSS JOIN messages as b
WHERE a.message_id <> b.message_id
and a.message = b.message
ORDER BY a.message_id