الدمج بين الجداول في SQL
يا هلا! اليوم بنتكلم عن موضوع مهم جداً في SQL: دمج الجداول. تخيل عندك بيانات موزعَة على جداول مختلفة، زي معلومات العملاء في جدول، وطلباتهم في جدول تاني. كيف تربط بينهم وتجيب كل المعلومات اللي تحتاجها في استعلام واحد؟ هنا يجي دور الـ JOIN.
ليش نحتاج دمج الجداول؟ (Why Joins?)
ببساطة، عشان نحافظ على كفاءة قاعدة البيانات وما نكرر البيانات. لو كل المعلومات كانت في جدول واحد، بيصير ضخم جداً وصعب إدارته وممكن تتكرر فيه معلومات كتير. عشان كذا، بنقسم البيانات لجداول أصغر ونربطها ببعض عن طريق مفاتيح (keys). الـ JOIN هو الأداة اللي بتخلينا نجمع البيانات دي تاني لما نحتاجها.
أنواع الـ JOINs
1. INNER JOIN (الدمج الداخلي)
هذا هو النوع الأكثر شيوعاً. بيجيب لك الصفوف المشتركة بين الجدولين فقط. يعني لو في صف في الجدول الأول ماله مقابل في الجدول الثاني (حسب الشرط اللي بتحدده)، ما راح يظهر في النتيجة، والعكس صحيح.
ملاحظة: الـ
INNER JOINممكن تكتبه كـJOINبس، وهو الافتراضي.
مثال: نبغى نجيب أسماء العملاء وطلباتهم.
SELECT
Customers.CustomerID,
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM
Customers
INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
2. LEFT JOIN (أو LEFT OUTER JOIN - الدمج الأيسر)
بيجيب لك كل الصفوف من الجدول اللي على اليسار (الجدول الأول في جملة FROM)، وبياخد معاها الصفوف اللي بتطابقها من الجدول اللي على اليمين. لو في صف في الجدول الأيسر ماله مقابل في الجدول الأيمن، بيظهر الصف الأيسر عادي بس مع قيم NULL للخانات اللي جاية من الجدول الأيمن.
مثال: نبغى كل العملاء، حتى لو ما عندهم أي طلبات.
SELECT
Customers.CustomerID,
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM
Customers
LEFT JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
3. RIGHT JOIN (أو RIGHT OUTER JOIN - الدمج الأيمن)
عكس الـ LEFT JOIN. بيجيب لك كل الصفوف من الجدول اللي على اليمين، وبياخد معاها الصفوف اللي بتطابقها من الجدول اللي على اليسار. لو في صف في الجدول الأيمن ماله مقابل في الجدول الأيسر، بيظهر الصف الأيمن عادي بس مع قيم NULL للخانات اللي جاية من الجدول الأيسر.
مثال: نبغى كل الطلبات، حتى لو فيه طلبات لعملاء غير موجودين (افتراضاً).
SELECT
Customers.CustomerID,
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM
Customers
RIGHT JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
نصيحة: كتير من المبرمجين بيفضلوا يستخدموا
LEFT JOINويقلبوا ترتيب الجداول لو محتاجين نفس نتيجة الـRIGHT JOINعشان يوحّدوا الأسلوب.
4. FULL JOIN (أو FULL OUTER JOIN - الدمج الكامل)
هذا بيجيب لك كل الصفوف من الجدولين، سواء كانت متطابقة أو لا. لو في صف ماله مقابل في الجدول الثاني، بيظهر عادي بس مع قيم NULL للخانات الناقصة.
مثال: نبغى كل العملاء وكل الطلبات، ونشوف مين مرتبط بمين.
SELECT
Customers.CustomerID,
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM
Customers
FULL JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
ملاحظة: الـ
FULL JOINمش مدعوم في كل قواعد البيانات زي MySQL مثلاً، لكنه موجود في SQL Server, PostgreSQL, Oracle.
5. CROSS JOIN (الدمج التقاطعي)
هذا بيعمل دمج لكل صف في الجدول الأول مع كل صف في الجدول الثاني. بيسموه "الضرب الديكارتي" (Cartesian Product). نادراً ما بتستخدمه بشكل مباشر، وممكن يكون خطير لو الجداول كبيرة لأنه بينتج عدد ضخم جداً من الصفوف.
مثال:
SELECT
Customers.CustomerName,
Products.ProductName
FROM
Customers
CROSS JOIN
Products;
ملاحظة: لو نسيت شرط الـ
ONفيINNER JOIN، النتيجة هتكونCROSS JOIN!
6. SELF JOIN (الدمج الذاتي)
هذا مش نوع JOIN منفصل، هو تكنيك بتستخدم فيه أي نوع من أنواع الـ JOIN (عادةً INNER JOIN أو LEFT JOIN) عشان تربط جدول بنفسه. مفيد لما يكون عندك علاقات هرمية داخل جدول واحد، زي الموظفين ومديريهم.
مثال: جدول Employees فيه EmployeeID, EmployeeName, و ManagerID. نبغى نعرف اسم كل موظف واسم مديره.
SELECT
E1.EmployeeName AS Employee,
E2.EmployeeName AS Manager
FROM
Employees AS E1
INNER JOIN
Employees AS E2 ON E1.ManagerID = E2.EmployeeID;
الـ ON والـ USING
بعد ما تختار نوع الـ JOIN، لازم تحدد الشرط اللي بتربط بيه الجداول. ده بيتم عادةً عن طريق جملة ON.
ON: بنستخدمها عشان نحدد عمود أو أكثر للربط، وممكن نحط شروط معقدة أكتر.
... ON Customers.CustomerID = Orders.CustomerID AND Customers.City = 'Riyadh';
USING: لو العمودين اللي بتربط بيهم ليهم نفس الاسم في الجدولين، ممكن تستخدم USING كاختصار.
SELECT *
FROM Customers
INNER JOIN Orders USING (CustomerID);
ملاحظة:
USINGأقل مرونة منONلأنها تتطلب أن تكون أسماء الأعمدة متطابقة في كلا الجدولين.
خلاصة
الـ JOINs هي قلب التعامل مع قواعد البيانات العلائقية. فهمك لأنواعها واستخداماتها هيخليك تكتب استعلامات قوية وفعالة. جرب الأمثلة دي بنفسك عشان ترسخ المعلومة!