العمل مع
جداول متعددة
فهم عمليات
الانضمام بين الجداول (INNER JOIN،
LEFT
JOIN، RIGHT JOIN)
في SQL، يمكن للمستخدمين الانضمام إلى جداول متعددة
معًا لاستعادة البيانات من مصادر متعددة. يعد فهم عمليات الانضمام والتقنيات ذات
الصلة أمرًا مهمًا لتحليل واستعادة البيانات بفعالية. هنا نلقي نظرة على العمل مع
جداول متعددة:
1. فهم عمليات
الانضمام بين الجداول:
- الانضمام الداخلي ((INNER JOIN يعيد الصفوف التي تتطابق في الجدول الأول والثاني وفقًا لشرط الانضمام.
- الانضمام الأيسر (LEFT JOIN) يعيد جميع الصفوف من الجدول الأيسر مع
تطابق الصفوف في الجدول الأيمن.
- الانضمام الأيمن ( (RIGHT JOIN يعيد جميع الصفوف من الجدول الأيمن مع تطابق الصفوف في الجدول الأيسر.
2. تنفيذ الانضمامات العرضية والانضمامات الذاتية:
الانضمام
العرضي (CROSS JOIN )
ينشئ الانضمامات العرضية مجموعة ناتجة تحتوي على كل صف في الجدول الأول يتم دمجه
مع كل صف في الجدول الثاني.
الانضمام
الذاتي ( (SELF JOIN): ينضم الجدول إلى نفسه، مما يسمح بمقارنة الصفوف في
الجدول نفسه بناءً على شروط محددة.
باستخدام هذه
العمليات، يمكن للمستخدمين القيام بتحليلات معقدة واستعادة البيانات بفعالية من
مصادر متعددة في قواعد البيانات.
مثال :-فرضاً أن لدينا جدولان: "المستخدمون" و "الطلبات". يمكننا استخدام الانضمام الداخلي للعثور على المستخدمين الذين قاموا بإجراء طلبات معينة.
من جدول معين
Table: Users +-------------+--------------+-----------+-------------+ | UserID | Username | Email | Role | +-------------+--------------+-----------+-------------+ | 1 | john_doe | john@email.com | admin | | 2 | jane_smith | jane@email.com | user | | 3 | ahmed_ali | ahmed@email.com| moderator | +-------------+--------------+-----------+-------------+ Table: Orders +-------------+-------------+-----------+ | OrderID | UserID | Amount | +-------------+-------------+-----------+ | 1 | 1 | 100.00 | | 2 | 2 | 50.00 | | 3 | 1 | 200.00 | +-------------+-------------+-----------+
هذه هي جداول المستخدمين والطلبات، وتظهر العلاقة بينهما. يتم ربط الجدولين باستخدام عمود UserID
الذي يعتبر
مفتاح خارجي في جدول الطلبات ويربطه بمفتاح رئيسي في جدول المستخدمين. هذه العلاقة
تسمح لنا بربط طلبات المستخدمين بمعلومات المستخدمين نفسهم.
SELECT Users.Username, Orders.Amount FROM Users INNER JOIN Orders ON Users.UserID = Orders.UserID;
النتيجة :-
--هذا الاستعلام يعيد المستخدمين الذين قاموا بإجراء طلبات ومبالغ هذه الطلبات.--| Username | Amount |
|-----------|---------|
| john_doe | 100.00 |
| john_doe | 200.00 |
| jane_smith| 50.00 |
.
الانضمام الأيسر ((LEFT JOIN):
فرضاً أن لدينا نفس الجدولين: "المستخدمون" و "الطلبات". يمكننا استخدام الانضمام الأيسر لاسترداد جميع المستخدمين بغض النظر عما إذا كان لديهم طلبات أو لا.
SELECT Users.Username, Orders.Amount
FROM Users
LEFT JOIN Orders ON Users.UserID = Orders.UserID;
النتيجة:-
هذا
الاستعلام يعيد جميع المستخدمين ومبالغ طلباتهم إذا كانت لديهم، ولكن يظهر قيمة NULL للمستخدمين الذين لم يقموا بأي
طلبات
| Username | Amount |
|------------|---------|
| john_doe | 100.00 |
| john_doe | 200.00 |
| jane_smith | 50.00 |
| ahmed_ali | NULL |
.
الانضمام العرضي(CROSS JOIN):)
فرضاً أن لدينا جدولان: "المنتجات" و "العملاء". يمكننا استخدام الانضمام العرضي لإنشاء توزيع كل المنتجات مع كل العملاء.
Table: Products
+-------------+
| ProductName |
+-------------+
| Product A |
| Product B |
| Product C |
+-------------+
Table: Customers
+--------------+
| CustomerName |
+--------------+
| Customer 1 |
| Customer 2 |
| Customer 3 |
+--------------+
SELECT Products.ProductName, Customers.CustomerName
FROM Products
CROSS JOIN Customers;
النتيجة:- هذا الاستعلام يعيد جميع التوزيعات المحتملة للمنتجات بين العملاء.
| ProductName | CustomerName |
|-------------|--------------|
| Product A | Customer 1 |
| Product A | Customer 2 |
| Product A | Customer 3 |
| Product B | Customer 1 |
| Product B | Customer 2 |
| Product B | Customer 3 |
| Product C | Customer 1 |
| Product C | Customer 2 |
| Product C | Customer 3 |
4.
الانضمام الذاتي ((SELF JOIN
فرضاً أن لدينا جدول يحتوي على بيانات الموظفين وبيانات مشرفيهم. يمكننا استخدام الانضمام الذاتي لربط بيانات الموظف ببيانات مشرفيهم في الجدول نفسه.
Table: Employees
+-------------+--------------+--------------+
| EmployeeID | EmployeeName | ManagerID |
+-------------+--------------+--------------+
| 1 | John Doe | 1 |
| 2 | Jane Smith | NULL |
| 3 | Ahmed Ali | 1 |
+-------------+--------------+--------------+
Table: Managers
+-------------+-------------+
| ManagerID | ManagerName |
+-------------+-------------+
| 1 | Sarah Jones |
| 2 | Michael Lee |
| 3 | Emily Wang |
+-------------+-------------+
SELECT E.EmployeeName, M.EmployeeName AS ManagerName
FROM Employees AS E
LEFT JOIN Employees AS M ON E.ManagerID = M.EmployeeID;
النتيجة:- هذا الناتج يعرض أسماء الموظفين مع أسماء مشرفيهم إذا كان لديهم مشرفين، أما إذا لم يكن لديهم مشرف فستكون قيمة NULL.
| EmployeeName | ManagerName |
|--------------|-------------|
| John Doe | Sarah Jones |
| Jane Smith | NULL |
| Ahmed Ali | Sarah Jones |