במדריך 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 :)