במדריך SQL הקודם, למדנו על GROUP BY ואיך משתמשים בו. במדריך הבא, כחלק מתכנית קורס SQL למתחילים, נלמד הכל על:
JOIN, UNION, CASE WHEN.
תכירו, יש כל מיני סוגי JOIN:
- LEFT JOIN
- RIGHT JOIN
- INNER JOIN
- CROSS JOIN
- FULL OUTER JOIN
SQL JOINS משמשים לחיבור בין טבלאות.
בגדול, הכלל הוא כזה:
אם אתם רוצים לחבר בין טבלה מסוימת לאחרת, אתם צריכים לקבוע מה סוג החיבור.
נשמע מסובך? אל תדאגו, זה בגלל שאנחנו בהתחלה.
INNER JOIN – משמש כאשר אנו רוצים את הערכים שיחזרו רק כשיש התאמה בין שתי הטבלאות.
בואו נראה דוגמא:
יש לנו טבלה שאנחנו כבר מכירים.
אנחנו רוצים לנתח את הנתונים לפי מדד של מדינות.
כרגע, יש לנו רק country_code והאמת, שאפשר לפתוח כל פעם דפדפן ולחפש מה זה אומר, אבל אנחנו יותר חכמים מזה.
אנחנו רוצים לדעת מה השם המלא של המדינה. במקרה, גילינו שיש ממש טבלה המכילה ״מפתחות״.
מעתה והלאה, נשתמש במושג ״מפתחות״, כאשר אנחנו מדברים על קישור בין טבלאות.
LEFT JOIN
לפניכם שתי טבלאות:
- table1 עם salary, country_code.
- table2 עם country_code, country.
אנחנו רוצים לייבא ל-table1, את השם המלא של המדינה.
אם אנחנו רוצים לקבל תוצאה בה כל העמודות מטבלה אחת נשארות, ואנו נקבל את כל ההתאמות מטבלה שתיים, אשתמש ב-SQL LEFT JOIN.
בכללי, זו אחת הצורות היעילות ביותר לשימוש ב-JOIN. למה, בעצם?
- היא דומה ל-VLOOKUP מאקסל.
- היא לא מחסירה לנו שורות מהטבלה המובילה.
שאלה: כמה שורות יתקבלו?
משמעות “null” – לא נמצאה התאמה.
SELECT salary,table1.country_code,country
FROM table1
LEFT JOIN table2
ON table1.country_code = table2.country_code
שימו לב למשהו חדש שלמדנו:
- כאשר שם העמודה מופיע בשתי טבלאות, עלינו להורות איזו עמודה מאיזו טבלה, נבחר להציג.
נסו בעצמכם, מה היה קורה אם הייתם בוחרים להציג את country_code מ-table2?
- שימו לב ל-Syntax, תמיד נעשה חיבורים סוג ה JOIN ואיזו טבלה נחבר , ואז המפתח המקשר לאחר ה ON
JOIN/ INNER JOIN
לפניכם, שתי טבלאות.
המטרה שלנו, היא למצוא רק את ההתאמה המלאה:
רק את השורות שיש בהן התאמה בין שתי הטבלאות.
אנחנו רוצים לייבא לטבלה table1 את השם המלא של המדינה.
שאלה: כמה שורות נקבל?
תשובה: נקבל רק שתי שורות, כי רק בשתי שורות יש התאמה.
SELECT salary,table1.country_code,country
FROM table1
JOIN table2
ON table1.country_code = table2.country_code
RIGHT JOIN
לפניכם, שתי טבלאות.
המטרה שלנו היא למצוא רק את ההתאמה המלאה, כאשר הטבלה המובילה היא table2.
שאלה: כמה שורות נקבל?
תשובה:
נקבל ארבע שורות:
SELECT salary,table2.country_code,country
FROM table2
RIGHT JOIN table1
ON table1.country_code = table2.country_code
שימו לב, שקיבלנו את כל השורות מ-table2, אבל לא קיבלנו התאמה מלאה ולכן חלק משורות השכר לא התמלאו.
CROSS JOIN
לפניכם, שתי טבלאות.
המטרה שלנו היא להבין מה המשמעות של פעולה זו:
SQL CROSS JOIN מתבצעת בדרך כלל על מניפולציות מורכבות יותר, ובעצם מכפילה כל שורה במספר השורות בטבלה השנייה.
שאלה: כמה שורות נקבל?
תשובה: נקבל 16 שורות.
SELECT salary,table2.country_code,country
FROM table2
CROSS JOIN table1
שימו לב, שקיבלנו את כל השורות מ-table2. אבל, לא קיבלנו התאמה מלאה ולכן, חלק משורות השכר לא התמלאו.
FULL OUTER JOIN
לפניכם, שתי טבלאות.
המטרה שלנו היא להבין מה המשמעות של פעולה זו:
FULL OUTER JOIN מיועדת לשימוש במצבים בהם יש ערך לקבלת כל העמודות, גם כשאין התאמה מלאה.
דוגמא:
נניח, ויש לנו טבלה אחת עם הוצאות שיווק לפי מדינה, וטבלה שנייה של הכנסות לפי מדינה.
נניח ולא השקענו בשיווק בארה״ב, ועדיין יש לנו הכנסות מהמדינה.
לעומת זאת, כן השקענו בשיווק ביוון, אבל לא היו לנו הכנסות.
לסיכומו של עניין, נרצה לבדוק גם את ההוצאות וגם את ההכנסות, גם במקרים בהם אין חפיפה בין ההוצאה להכנסה.
כיצד הטבלה תיראה אצלנו?
שאלה: כמה שורות נקבל?
תשובה: נקבל שש שורות.
SELECT table1.country_code,country, table2.country_code,salary
FROM table2
FULL OUTER JOIN table1
ON table1.country_code = table2.country_code
שאלות SQL מסוג JOIN:
שאלות:
- חברו בין הטבלאות והציגו רק את העובדים ממדינת ארה״ב.
- חברו בין הטבלאות והציגו את המדינות בהן לא היו עובדים כלל.
- חברו בין הטבלאות והציגו את רשימת המדינות DISTINCT המופיעות בטבלה הראשונה או השנייה.
- חברו בין הטבלאות, והציגו את המדינות שיש בהן עובדים (ממוינים מהגדול לקטן, לפי כמות עובדים).
CASE WHEN
CASE WHEN היא פונקציה פשוטה, יעילה ושכיחה ביותר.
מי שמכיר את פונקציית IF באקסל, זו בדיוק הפונקציה המדוברת.
יש לזכור: כשאנחנו מפעילים פונקציה ב-SQL, היא תבצע את החישוב על כל העמודה.
אז, איך כותבים אותה?
CASE WHEN [COLUM] = THEN 1 ELSE 0 END
דוגמא:
נניח ואנחנו רוצים להוסיף עמודה חדשה שבה יהיה רשום:
כל מי שמרוויח מעל $40,000, מרוויח – High.
כל מי שמרוויח בין $30,000 ל-$39,999, מרוויח – Medium.
כל מי שמרוויח פחות מ-$30,000, מרוויח – Low.
שאלה: כמה שורות נקבל?
SELECT
Email,
salary,
CASE WHEN salary>40000 THEN ‘High’
WHEN salary between 30000 and 39999 then THEN ‘Medium’
ELSE ‘Small’ END as salary_bucket
FROM Data_salaries
שימו לב לכמה דברים שלמדנו והשתמשנו בהם כאן:
- between < אנחנו משתמשים בו כל הזמן, הוא לא מוגבל רק למקומות מסוימים כמו WHERE.
- שימו לב להיררכיה: בהתחלה עשינו תנאי ״גדול מ-40000״. אם לא עומד בתנאי, ממשיך לשורה הבאה, וכן הלאה.
חשוב מאוד להבין את העיקרון.
UNION ALL
UNION ALL הינה פונקציה יעילה ושכיחה ביותר.
נגיד, ויש לנו שני קבצים באותו פורמט בדיוק, ונרצה לייצר מהם טבלת נתונים אחת.
בדוגמא שלנו, אנחנו מעדכנים את הנתונים על אנשי הדאטה אחת לחודש, ושומרים אותם בתור טבלאות נפרדות בדאטה בייס. כדי לאחד ביניהם, אנחנו נשתמש ב-UNION ON.
לפנינו table1 ,table2. אם נרצה לאחד ביניהם, נשתמש בפקודה הנ״ל.
שאלה: כמה שורות נקבל?
SELECT
Month,
First_name,
Last_name,
Data_role,
domain
FROM table1
UNION ALL
SELECT
Month,
First_name,
Last_name,
Data_role,
domain
FROM table2
נקודות חשובות:
ישנן טכניקות מתקדמות מאוד לשימוש ב-UNION כדי לפתור בעיות.
אחת מהן, היא איחוד מקורות של נתונים ממקומות שונים.
דוגמא:
נניח ותרצו לאחד בין דו״ח ביצועי שיווק לאתר שלכם, עם דו״ח רכישות באתר.
לשליטה מלאה בנלמד, אנו ממליצים לתרגל שאלות SQL על ידי מדריכים המוצעים באתר זה, כחלק מהקורס SQL שלנו.
CTE/ WITH
אחת הדרכים הכי נוחות לניהול קוד, היא שימוש ב-WITH.
שימוש בפונקציה זו, מאפשר לנו לבצע חישובים מורכבים בצורה פשוטה וקלה.
דוגמא:
SELECT AVG(salary) salary,table1.country_code,country
FROM table1
JOIN table2
ON table1.country_code = table2.country_code
WHERE salary >30000
GROUP BY table1.country_code,country
איך SQL עובד מאחורי הקלעים?
בכדי להפוך למומחי SQL, אנחנו חייבים לדעת כיצד שפת תכנות זו עובדת מאחורי הקלעים.
לימוד SQL מעמיק יותר, יעזור לכם להבין מדוע פעולות מסוימות יעילות או לא, וכיצד ניתן לשפר את הקוד שלנו.
אז, אלו הכללים:
- FROM
- JOIN
- WHERE
- GROUP BY
- ORDER BY
- WINDOWS FUNCTIONS
דוגמא:
SELECT
data_role,
AVG([salary]),
FROM Data_salaries
GROUP BY data_role
HAVING data_role =’VP’
VS
SELECT
data_role,
AVG([salary]),
FROM Data_salaries
where data_role =’VP’
GROUP BY data_role
נגיד, ויש לנו טבלה של מאה מיליון שורות, ויש לנו עשר שורות שעונות לתנאי VP.
מה קורה בשאילתה הראשונה?
- קודם כל, מתבצעת פעולת ה-FROM.
- לאחר מכן, GROUP BY.
- ולבסוף, אנחנו מסננים את התוצאות.
מה קורה בשאילתה השנייה?
- קודם כל, מתבצעת פעולת ה-FROM.
- לאחר מכן ה-WHERE.
- לבסוף, GROUP BY.
להלן הסבר על שתי הטבלאות:
אנחנו קוראים את הטבלה, מסננים את הטבלה ממאה מיליון שורות רק לעשר, ואז מיישמים את פעולת GROUP BY.
בעוד שבטבלה הראשונה, GROUP BY מיושמת על מאה מיליון שורות, נראה לנו די ברור שהטבלה הראשונה הרבה פחות יעילה, כי היא מבצעת פעולה לא הכרחית על כל הטבלה.
שימו לב, הכרת הפעולות ושינון הסדר, חיוני מאוד על מנת להתקדם לשלב הבא בלהיות SQL Master.
אם הגעתם עד כה, אתם מוזמנים להתחיל לתרגל את הידע שצברתם במדריכים השונים, כחלק מהקורס SQL שלנו.
Practice makes perfect 🙂