شرح Left Join في SQL: مقال تفصيلي
في عالم قواعد البيانات، تُعتبر Left Join واحدة من الأدوات الأساسية والمهمة التي تُستخدم لدمج جداول متعددة في استعلام واحد. تُسهم هذه التقنية في تحليل البيانات وربطها من مصادر مختلفة بفعالية وسلاسة. يعتمد فهم Left Join على معرفة أساسية بنظرية قواعد البيانات وعلاقات الجداول.
في هذا المقال، سنشرح بالتفصيل مفهوم Left Join، طريقة استخدامها، وفوائدها مع أمثلة توضيحية تُغطي كافة الجوانب التقنية.
مفهوم الـ Left Join
تُستخدم Left Join في SQL لجلب كافة السجلات من الجدول الأساسي (Left Table) مع السجلات المتطابقة من الجدول المرتبط (Right Table). إذا لم تكن هناك سجلات مطابقة في الجدول المرتبط، يتم إرجاع NULL للقيم الخاصة بالجدول الثاني.
الصيغة العامة:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
- table1: الجدول الأساسي (الجدول الأيسر).
- table2: الجدول المرتبط (الجدول الأيمن).
- ON: شرط الربط بين الجداول.
كيفية عمل Left Join
الخطوات:
- يُحدد SQL كافة السجلات الموجودة في الجدول الأيسر.
- يُطابق السجلات الموجودة في الجدول الأيسر مع الجدول الأيمن بناءً على الشرط المحدد.
- يتم إرجاع كافة السجلات من الجدول الأيسر، مع إضافة البيانات المطابقة من الجدول الأيمن.
- إذا لم توجد مطابقة، يتم إرجاع NULL.
مثال توضيحي
إنشاء الجداول:
CREATE TABLE Employees (
EmployeeID INT,
Name VARCHAR(100),
DepartmentID INT
);
CREATE TABLE Departments (
DepartmentID INT,
DepartmentName VARCHAR(100)
);
إدخال البيانات:
INSERT INTO Employees (EmployeeID, Name, DepartmentID) VALUES
(1, 'Ahmed', 101),
(2, 'Sara', 102),
(3, 'Ali', NULL),
(4, 'Huda', 103);
INSERT INTO Departments (DepartmentID, DepartmentName) VALUES
(101, 'HR'),
(102, 'Finance'),
(104, 'IT');
الاستعلام باستخدام Left Join:
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
النتيجة:
Name | DepartmentName |
---|---|
Ahmed | HR |
Sara | Finance |
Ali | NULL |
Huda | NULL |
الفرق بين Left Join و Inner Join
- Left Join: تُظهر جميع السجلات من الجدول الأيسر بغض النظر عن وجود تطابق.
- Inner Join: تُظهر فقط السجلات التي يوجد لها تطابق في كلا الجدولين.
مثال مقارنة:
-- باستخدام Left Join
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
-- باستخدام Inner Join
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
النتائج:
- Left Join: تظهر السجلات بالكامل مع NULL عند عدم وجود تطابق.
- Inner Join: لا تظهر السجلات التي لا تحتوي على تطابق.
الاستخدامات العملية لـ Left Join
- عرض البيانات الناقصة:
- تُستخدم Left Join لاستعراض السجلات التي قد تكون ناقصة أو غير مكتملة في جدول معين.
مثال:
عرض جميع الموظفين مع أقسامهم، حتى لو لم يتم تخصيص قسم لبعض الموظفين.
- إنشاء تقارير شاملة:
- تُستخدم Left Join لإنشاء تقارير تحتوي على جميع البيانات من الجدول الأساسي مع التفاصيل المتوفرة من الجداول المرتبطة.
- التعامل مع القيم الافتراضية:
- يمكن استخدام Left Join لتحديد السجلات التي تحتاج إلى تحديث أو إكمال بياناتها.
مثال:
عرض جميع المنتجات التي لم يتم بيعها بعد:
SELECT Products.ProductName, Sales.SaleID FROM Products LEFT JOIN Sales ON Products.ProductID = Sales.ProductID WHERE Sales.SaleID IS NULL;
أداء Left Join وتحسينه
- الفهارس (Indexes): تأكد من وجود فهارس على الأعمدة المستخدمة في شروط الربط لتحسين الأداء.
- تقليل عدد الأعمدة: اختر فقط الأعمدة التي تحتاجها لتقليل حجم البيانات.
- استخدام شروط التصفية: أضف شروط تصفية (WHERE) لتقليل عدد السجلات التي يتم معالجتها.
أخطاء شائعة مع Left Join
- نسيان شرط الربط:
- قد يؤدي نسيان ON إلى دمج غير صحيح للبيانات.
- مثال خاطئ:
SELECT * FROM Employees LEFT JOIN Departments;
- الصيحيح:
SELECT * FROM Employees LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
- إهمال التعامل مع القيم NULL:
- عند استخدام Left Join، تأكد من معالجة القيم NULL في النتائج.
أسئلة متكررة
- هل يمكن استخدام Left Join مع أكثر من جدول؟
- نعم، يمكن استخدام Left Join مع عدة جداول.
SELECT A.*, B.*, C.* FROM TableA A LEFT JOIN TableB B ON A.ID = B.ID LEFT JOIN TableC C ON A.ID = C.ID;
- هل Left Join أسرع من Inner Join؟
- يعتمد الأداء على حجم البيانات وهيكل الجداول. بشكل عام، Inner Join أسرع لأنه يعالج فقط السجلات المطابقة.
- متى يُفضل استخدام Left Join؟
- عندما تحتاج إلى رؤية جميع السجلات من الجدول الأيسر مع التفاصيل الموجودة من الجدول الأيمن.
الخاتمة
Left Join هي واحدة من الأدوات الأكثر شيوعًا وفعالية في تحليل وربط البيانات في SQL. يوفر هذا النوع من الربط مرونة كبيرة في استخراج المعلومات حتى مع وجود بيانات ناقصة. باستخدام الأمثلة والاستراتيجيات الموضحة أعلاه، يمكنك الاستفادة الكاملة من Left Join لتحسين استعلاماتك وتحليل البيانات بفعالية.
ملخص
يعتمد مفهوم ال Left join على جدول ايسر وجدول أيمن كما هو موضح في الصورة
الجدول الأيسر ويشار اليه ب Table1 والجدول الأيمن ويشار اليه ب Table2
مهمة ال Left join هو جلب كافة السجلات من الجدول الأيسر وجلب فقط السجلات المشتركة من الجدول الأيمن مع وضع قيمة Null اما السجل الغير مرتبط
كيف ؟
في #المثال التالي سوف نوضح ذلك خطوة بخطوة
لنفترض ان لدينا جدول الزبائن Customer يحتوي على البيانات التالية رقم الزبون – اسم الزبون – رقم الهاتف
CUST_ID CUST_NAME CUST_PHONE
N1 OMER 1269
N2 GAMAL 1259
N3 MOHAMMED 1249
N4 KHALED 1239
ولدينا أيضآ جدول الطلبيات ORDER يحتوي على رقم الطلبية ورقم الزبون وتاريخ الطلبية
ORDER_ID CUST_ID ORDER_DATE
O1 N1 09/09/2018
O2 N2 10/09/2018
O3 N3 11/09/2018
لاحظ ان جدول ال ORDER مرتبط بجدول ال CUSTOMER بواسطة CUST_ID الذي هو رقم الزبون
ولاحظ أيضآ ان الزبون KHALED الذي لديه ال ID = N4 لاتوجد لديه طلبية
لنفترض اننا نريد طباعة تقرير يحتوي فقط على الزبائن الذين لديهم طلبيات طبعآ الزبون الذي لديه طلبيه ستجد ال ID الخاص به مسجل في جدول الطلبيات ORDER في حالة اذا اردت جلب السجلات المشتركة فقط اي الزبائن الذيز لديهم طلبية سوف نستخدم ال inner join التي تحدثنا عنها في الدرس السابق التي فقط ستقوم بطباعة السجلات المشتركة في هذه الحالة لن يتم طباعة الزبون KHALED لانه ليس لديه طلبية لأن ال ID الخاص به غير مسجل في جدول الطلبيات هذا مايخص ال Inner join لكن ماذا عن Left loin
تقوم ال left join بجلب كافة السجلات من الجدول الأيسر الذي هو جدول الزبائن CUSTOMER وجلب فقط السجلات المشتركة من الجدول الأيمن مع وضع قيمة NULL امام السجلات الغير مشتركة
في هذه الحالة سيظهر اسم KHALED في الاستعلام وستضع امامه القيمة NULL للدلالة على ان هذا السجل غير مشترك عندها سنعرف نحن ان KHALED ليست لديه طلبية
الان سنقوم بصياغة استعلام على هذين الجدولين يوضح كيفية استخدام ال Left join
SELECT Customer.Cust_Name, Order.Order_ID
FROM Customer
LEFT JOIN Orders ONCustomer.Cust_ID = Order.CustID