מדריך חלק שלישי
SQL -LEFT JOIN ,INNER JOIN, CROSS JOIN

במדריך SQL הקודם, למדנו על GROUP BY ואיך משתמשים בו. במדריך הבא, כחלק מתכנית קורס SQL למתחילים, נלמד הכל על:

JOIN, UNION, CASE WHEN.

תכירו, יש כל מיני סוגי JOIN:

  1. LEFT JOIN
  2. RIGHT JOIN
  3. INNER JOIN
  4. CROSS JOIN
  5. FULL OUTER JOIN

אם פספסתם את הבלוג הראשון ואתם מעוניינים לתרגל בbigquery של גוגל את השאלות שמופיעות בבלוג בחינם  לחצו על הלינק חלק ראשון

 

SQL JOINS משמשים לחיבור בין טבלאות.

בגדול, הכלל הוא כזה:

אם אתם רוצים לחבר בין טבלה מסוימת לאחרת, אתם צריכים לקבוע מה סוג החיבור.

נשמע מסובך? אל תדאגו, זה בגלל שאנחנו בהתחלה.

INNER JOIN – משמש כאשר אנו רוצים את הערכים שיחזרו רק כשיש התאמה בין שתי הטבלאות.

בואו נראה דוגמא:

יש לנו טבלה שאנחנו כבר מכירים.

אנחנו רוצים לנתח את הנתונים לפי מדד של מדינות.

כרגע, יש לנו רק country_code והאמת, שאפשר לפתוח כל פעם דפדפן ולחפש מה זה אומר, אבל אנחנו יותר חכמים מזה.

אנחנו רוצים לדעת מה השם המלא של המדינה. במקרה, גילינו שיש ממש טבלה המכילה ״מפתחות״.

מעתה והלאה, נשתמש במושג ״מפתחות״, כאשר אנחנו מדברים על קישור בין טבלאות.

 

בדוגמא למטה נראה שתי טבלאות שונות שהמפתח המקשר בינהם הוא עמודת country_code

LEFT JOIN

לפניכם שתי טבלאות:

  1. table1 עם salary, country_code.
  1. table2 עם country_code, country.

אנחנו רוצים להוסיף ל-table1, את השם המלא של המדינה.

 

אם אנחנו רוצים לקבל תוצאה בה כל העמודות מטבלה אחת נשארות, ואנו נקבל את כל ההתאמות מטבלה שתיים, אשתמש ב-LEFT JOIN.

בכללי, זו אחת הצורות היעילות ביותר לשימוש ב-JOIN. למה, בעצם?

  1. היא דומה ל-VLOOKUP מאקסל.
  2. היא לא מחסירה לנו שורות מהטבלה המובילה.
				
					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

לפניכם שתי טבלאות:

  1. table1 עם salary, country_code.
  2. table2 עם country_code, country.

המטרה שלנו, היא למצוא רק את ההתאמה המלאה

רק את השורות שיש בהן התאמה בין שתי הטבלאות.

אנחנו רוצים לייבא לטבלה table1 את השם המלא של המדינה.

 

 

table
table
				
					--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

table sql

שימו לב שנעלמו לנו שורות פה משתי הטבלאות,

למה?
כי 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
    
				
			

מחנה אימונים ב SQL

מעל 50 שאלות לפי נושאים, לתרגל ולהבין כמו שצריך!