יסודות של SQL Server: שימוש בשאילתות SQL

במסדי נתונים יחסיים כמו SQL Server, ההצהרת JOIN של SQL משמשת לשאילתה, חיבור ואיחוד נתונים ממספר טבלאות בהתבסס על הקשרים הנתונים ביניהן. ניתן להשתמש בהצהרת JOIN של SQL עם שתי או יותר טבלאות, ובעיקרון היא מחזירה רשומות שיש להן ערכים תואמים בטבלאות השונות. במדריך זה, אני אסביר כיצד להשתמש בסוגי JOIN של SQL הנפוצים ביותר כולל JOIN פנימי של SQL, JOIN שמאלי של SQL, JOIN ימני של SQL, ו-JOIN חיצוני של SQL.

JOIN ב־SQL הם תכונה חיונית לשימוש בעת עבודה עם מסדי נתונים יחסיים. הם בעיקר מבוצעים באמצעות ההצהרה SELECT של SQL. ניתן ללמוד עוד על התחלה עם ההצהרה SELECT של T-SQL במאמר הקודם שלי על שרתי SQL: שימוש בהצהרה SELECT של SQL ובתנאי WHERE וHAVING כדי לאחזר נתונים.

פרסומת

JOIN פנימי של SQL

הפעולה JOIN הפנימית של SQL יוצרת סט תוצאות על ידי שילוב שורות שיש להן ערכים תואמים בשתי או יותר טבלאות. זהו כנראה המבצע הנפוץ ביותר של JOIN ב-T-SQL. JOIN פנימי של SQL מחזיר רק שורות שיש להן ערכים תואמים, והוא משמש לאחזור נתונים שנראים בכל הטבלאות.

התרשים הבא ממחיש כיצד פעולת INNER JOIN של SQL עובדת עם שתי טבלאות.

How an SQL INNER JOIN operation works with two tables (Image credit: Petri/Michael Otey)

התחביר ל-INNER JOIN די פשוט. כחלק מההצהרת SELECT שלך, אתה מציין את שתי הטבלאות להצטרף ואת העמודות לשימוש בהתאמת שורות.

בואו נסתכל קרוב יותר על שתי הטבלאות מבסיס הנתונים לדוגמה AdventureWorksLT2019. אם נשתמש בטבלת SalesLT.Customer ובטבלת SalesLT.SalesOrderHeader, נוכל להשתמש ב-INNER JOIN של SQL כדי לאחזר את ההזמנות עבור הלקוחות בטבלת SalesLT.Customer על ידי הצטרפות שתי הטבלאות על העמודה CustomerID, שהיא עמודה משותפת בשתי הטבלאות.

פרסום

הנה השאילתת T-SQL שאתה יכול להשתמש כדי לבצע את זה:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate 
FROM SalesLT.Customer c
INNER JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID

כך עובדת תחביר ה-INNER JOIN של SQL:

  • כאן, אתה רואה שאנו בוחרים את העמודות 'CustomerID', 'FirstName' ו-'LastName' מטבלת SalesLT.Customer, ואת העמודות 'SalesOrderID' ו-'OrderDate' מטבלת SalesLT.SalesOrderHeader.
  • ה-'c' וה-'soh' הם קיצורי שמות טבלה שמסירים את הצורך להשתמש תמיד בשם הטבלה המלא כאשר מתייחסים לעמודות.
  • אנו משתמשים במילת המפתח INNER JOIN כדי להצטרף את שתי הטבלאות. מילת המפתח ON מציינת את העמודה לשימוש בהצטרפות. כאן זו העמודה 'CustomerID'.

שאילתה זו תחזיר קבוצת תוצאות הכוללת את העמודות 'CustomerID', 'FirstName', 'LastName', 'SalesOrderID' ו- 'OrderDate' עבור כל לקוח שהזמין פריט, כפי שאפשר לראות באיור הבא.

The result of our SQL INNER JOIN query (Image credit: Petri/Michael Otey)

SQL LEFT JOIN

פעולת SQL LEFT OUTER JOIN תיצור גם קבוצת תוצאות על ידי התאמת שורות בין שני הטבלאות הקודמות שלנו. עם SQL LEFT JOIN, עם זאת, אם אין רשומות התאמה מהטבלה השמאלית, זה יראה את הרשומות האלה עם ערכי null.

פרסומת

זה שימושי כשאתה רוצה לכלול את כל השורות מהטבלה הראשונה ורק את השורות המתאימות מהטבלה השנייה, גם אם אין התאמה בטבלה הימנית. SQL LEFT OUTER JOIN יחזיר ערכי null בעמודות מהטבלה הימנית אם אין התאמה.

התרשים הבא ממחיש איך פעולת SQL LEFT OUTER JOIN פועל עם שתי טבלאות.

How an SQL LEFT OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

התחביר ל- LEFT JOIN גם די פשוט. כחלק מהמשפט SELECT, אתה מציין את שתי הטבלאות לצרף, את העמודות לשימוש בהן להתאמת שורות, ואת פירוט ה- LEFT JOIN קלאס.

בואו נסתכל יותר מקרוב על שתי טבלאות ממסד הנתונים AdventureWorksLT2019. לדוגמה, כדי להחזיר את כל הלקוחות וכל הזמנות שיש להם, אפשר להשתמש בטבלאות SalesLT.Customer ו- SalesLT.SalesOrderHeader ולבצע LEFT JOIN כפי שאפשר לראות ברשימה הבאה:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
LEFT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • בדוגמה זו, אנו בוחרים את העמודות 'CustomerID', 'FirstName', 'LastName', 'SalesOrderID' ו- 'OrderDate' מהטבלאות SalesLT.Customer ו- SalesLT.SalesOrderHeader.
  • אנו משתמשים במילת המפתח LEFT JOIN כדי לשרשר את שני הטבלאות ובמילת המפתח ON שנשתמש בעמודת 'CustomerID' כדי לשרשר את שתי הטבלאות.

ניתן לראות את תוצאות שאילתת ה-LEFT JOIN ב-SQL בתמונה למטה.

The results of our SQL LEFT JOIN query (Image credit: Petri/Michael Otey)

שאילתת זו תחזיר סט תוצאות הכולל את כל הלקוחות בטבלת SalesLT.Customer, יחד עם כל מידע הזמנה תואם מטבלת SalesLT.SalesOrderHeader. אם ללקוח אין הזמנות בטבלת SalesLT.SalesOrderHeader, אז עמודות מטבלה זו יהיו ריקות. ניתן לראות מספר ערכים ריקים בתמונה הקודמת.

SQL RIGHT JOIN

כפי שאתה יכול לנחש, פעולת ה-JOIN החיצונית הימנית ב-SQL בעצם היא ההפוכה של JOIN החיצונית השמאלית. JOIN הימני בוחר נתונים מהטבלה הימנית (טבלה 2) ומתאם את הנתונים האלו עם השורות מהטבלה השמאלית (טבלה 1).

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

התרשים הבא ממחיש כיצד JOIN ימני עובד עם שתי טבלאות:

How a right JOIN works with two tables (Image credit: Petri/Michael Otey)

ניתן להציג זאת עם הטבלה SalesLT.Customer ו-SalesLT.SalesOrderHeader מבסיס הנתונים AdventuresLT2019. כדי לקבל את כל ההזמנות ומידע הלקוח התואם שלהן, ניתן להשתמש בשאילתת JOIN ימני כפי שניתן לראות בדוגמה הבאה:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
RIGHT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • בדוגמה זו, אנו בוחרים את העמודות 'CustomerID', 'FirstName', 'LastName', 'SalesOrderID', ו-'OrderDate' מהטבלאות SalesLT.Customer ו-SalesLT.SalesOrderHeader.
  • המילה המפתח RIGHT JOIN משמשת לחיבור שתי הטבלאות, והמילה המפתח ON מציינת כי אנו מחברים את שתי הטבלאות על העמודה 'CustomerID'.

שאילתה זו תחזיר קבוצת תוצאות הכוללת את כל ההזמנות בטבלת SalesLT.SalesOrderHeader, יחד עם מידע הלקוח המתאים מטבלת SalesLT.Customer אם קיים. אם הזמנה אינה מכילה לקוח תואם בטבלת SalesLT.Customer, העמודות של הלקוח בקבוצת התוצאות יהיו ריקות.

כנראה תשימו לב כי שאילתה זו דומה מאוד לשאילתה הקודמת. אך חיבור ה-LEFT JOIN הביא להופעת רבות של שורות עם ערכים ריקים מטבלת SaleOrderHeader. בעוד ששאילתה האחרונה שלנו אינה מכילה ערכים ריקים בשורות מטבלת SaleOrderHeader.

תוצאות הפעולה שלנו ב- SQL RIGHT OUTER JOIN מוצגות בתרשים הבא.

The results of our SQL RIGHT OUTER JOIN operation (Image credit: Petri/Michael Otey)

חיבור חיצוני של SQL

חיבור חיצוני של SQL אינו סוג החיבור הנפוץ ביותר. לעיתים נקרא FULL JOIN, שאילתת החיבור החיצונית לא תחזיר רק את השורות התואמות אלא גם את השורות שאינן תואמות. כלומר, היא מחזירה נתונים מהטבלה המחוברת כאשר יש תואם באחת מהטבלאות השמאלית או הימנית.

כפי שתיכון, זה גורם ליצירת קבוצות תוצאות גדולות יותר מסוגי החיבור האחרים. התרשים הבא ממחיש איך פעולת החיבור החיצונית של SQL עובדת עם שתי טבלאות.

How an SQL OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

I’ll give you an example of an SQL OUTER JOIN operation using the SalesLT.SalesOrderHeader and SalesLT.SalesOrderDetail tables. Here, we want to retrieve all sales orders and their associated details, including orders that don’t have any details records.

כדי לעשות זאת, אנו יכולים להשתמש ב-FULL OUTER JOIN. זה יחזיר גם כל שורות SalesOrderDetail שלא היו בעלות שורת SalesOrderHeader מתאימה. ברוב המקרים הרגילים, כל שורות SalesOrderDetails צריכות להיות בעלות שורת SalesOrderHearder מתאימה, אך זה לא יכול להיות המקרה אם היה שגיאת יישום או שגיאת מערכת שזה יכול לעזור לגבות.

הנה שאילתת T-SQL המציגה דוגמא ל-FULL OUTER JOIN:

USE AdventureWorksLT2019

SELECT soh.SalesOrderID, soh.OrderDate, sod.ProductID, sod.OrderQty, sod.UnitPrice
FROM SalesLT.SalesOrderHeader soh
FULL OUTER JOIN SalesLT.SalesOrderDetail sod
ON soh.SalesOrderID = sod.SalesOrderID
  • בדוגמה זו, אנו בוחרים את העמודות 'SalesOrderID', 'OrderDate', 'ProductID', 'Quantity' ו- 'UnitPrice' משני השולחנות SalesLT.SalesOrderHeader ו- SalesLT.SalesOrderDetail.
  • אנו משתמשים במילה מפתח FULL OUTER JOIN כדי לחבר את שני השולחנות, ובמילה מפתח ON כדי לציין שהעמודה SalesOrderID תשמש לחיבור שני השולחנות.
  • שאילתה זו תחזיר קבוצת תוצאות הכוללות את כל ההזמנות המכירה בשולחן SalesLT.SalesOrderHeader, יחד עם פרטי המידע המתאימים משולחן SalesLT.SalesOrderDetail. זה יכלול גם את כל הפרטים בשולחן SalesLT.SalesOrderDetail, יחד עם מידע הזמנת הראשי המתאים אם הוא זמין.
  • אם הזמנת מכירה אינה בעלת פרטים בשולחן SalesLT.SalesOrderDetail, אז העמודות תהיינה NULL. אם פרט אינו בעל הזמנת מכירה מתאימה בשולחן SalesLT.SalesOrderHeader, אז עמודות ההזמנה תהיינה NULL.

תוצאות פעולת ה-FULL OUTER JOIN הזו מוצגות באיור הבא.

The results of our FULL OUTER JOIN operation (Image credit: Petri/Michael Otey)

למידת היסודות של SQL Join

בדרכה זו, כיסיתי את הסוגים השונים הנפוצים ביותר של SQL JOINS. הראיתי כיצד להשתמש ב- INNER JOIN, ב- LEFT JOIN, ב- RIGHT JOIN וגם ב- OUTER JOIN, וגם הסברתי כיצד הם שונים והיכן ניתן להשתמש בהם. בפוסט קרוב, אסביר על כמה מהפעולות הנדירות יותר כמו CROSS JOIN ו- SELF JOIN, אז הישארו מעודדים ל- Petri!

מאמר קשור:

Source:
https://petri.com/sql-join/