TOP

SQL-الدرس 11. مجموعة الجداول المتقدمة (OUTER JOIN)

في القسم السابق، تناولنا أبسط الطرق لدمج الجداول - باستخدام جمل WHERE وINNER JOIN. تسمى هذه المجموعات بالمجموعات الداخلية أو مجموعات التكافؤ. ومع ذلك، تحتوي SQL في ترسانتها على العديد من الخيارات لربط الجداول، أي أن هناك أيضًا أنواعًا أخرى من الصلات: الصلات الخارجية، والصلات الطبيعية، والصلات الذاتية. لكن أولاً، دعونا نفكر في كيفية تعيين أسماء مستعارة للجداول، حيث سنضطر لاحقًا إلى استخدام الأسماء الكاملة للحقول (Table.Field)، والتي سيكون من الصعب جدًا تشغيلها بدون اختصارات نظرًا لطولها الكبير.


1. استخدام الأسماء المستعارة للجدول (الأسماء المستعارة)

في القسم السابق، تعلمنا كيف يمكن استخدام الأسماء المستعارة للإشارة إلى حقول جدول محددة أو حقول محسوبة. يسمح لنا SQL أيضًا باستخدام الأسماء المستعارة بدلاً من أسماء الجداول. يمنحنا هذا مزايا مثل بناء جملة SQL أقصر ويسمح لنا باستخدام نفس الجدول عدة مرات في عبارة SELECT.

Run SQLSELECT Seller_name, SUM(Amount) AS Sum1 
FROM Sellers AS S, Sumproduct AS SP 
WHERE S.City = SP.City 
GROUP BY Seller_name

قمنا بعرض إجمالي كمية البضائع المباعة لكل بائع. في استعلام SQL الخاص بنا، استخدمنا الأسماء المستعارة التالية: بالنسبة للحقل المحسوب SUM(Amount) الاسم المستعار Sum1، وللجدول Sellers الاسم المستعار S، وبالنسبة لـ Sumproduct الاسم المستعار SP. لاحظ أنه يمكن أيضًا استخدام الأسماء المستعارة للجدول في جمل أخرى، مثل ORDER BY، GROUP BY وغيرها.

2. الاتصال الذاتي (SELF JOIN)

دعونا نفكر في مثال. لنفترض أننا بحاجة إلى معرفة عناوين البائعين الذين يتاجرون في نفس البلد الذي يتاجر فيه جون سميث. للقيام بذلك، سنقوم بإنشاء الطلب التالي:

Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country 
                 FROM Sellers 
                 WHERE Seller_name = 'John Smith')

كما يمكننا حل هذه المشكلة من خلال الاتصال الذاتي عن طريق كتابة الكود التالي:

Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2 
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'

واستخدمت أسماء مستعارة لحل هذه المشكلة. في المرة الأولى تم تعيين الاسم المستعار S1 للجدول Sellers، وفي المرة الثانية - الاسم المستعار S2. يمكن بعد ذلك استخدام هذه الأسماء المستعارة كأسماء جداول. في عامل التشغيل WHERE، نضيف البادئة S1 إلى اسم كل حقل، بحيث يفهم نظام إدارة قواعد البيانات الحقول التي يجب إخراج الجدول منها (نظرًا لأننا أنشأنا جدولين افتراضيين من جدول واحد). تقوم جملة WHERE أولاً بربط الجداول ثم تقوم بتصفية بيانات الجدول الثاني حسب الحقل Seller_name لإرجاع القيم الضرورية فقط.

تُستخدم الصلات الذاتية غالبًا لاستبدال الاستعلامات الفرعية التي تحدد البيانات من نفس الجدول مثل عامل التشغيل الخارجي SELECT. على الرغم من أن النتيجة النهائية هي نفسها، إلا أن العديد من عمليات نظم إدارة قواعد البيانات تنضم بشكل أسرع بكثير من الاستعلامات الفرعية. يجدر التجربة لتحديد الاستعلام الذي يعمل بشكل أسرع.

3. تركيبة طبيعية

الصلة الطبيعية هي صلة تحدد فيها فقط تلك الأعمدة التي لا تتكرر. ويتم ذلك عادةً عن طريق كتابة (SELECT *) لجدول واحد وتحديد قائمة الحقول لبقية الجداول. مثال:

Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S 
WHERE SP.City = S.City

في هذا المثال، يتم استخدام حرف البدل (*) للجدول الأول فقط. يتم تحديد كافة الأعمدة الأخرى بشكل صريح، لذلك لا يتم تحديد الأعمدة المكررة.

4. المجموعة الخارجية (OUTER JOIN)

عادةً، عند الدمج، يتم ربط صفوف جدول واحد بالصفوف المقابلة في جدول آخر، ومع ذلك، في بعض الحالات، قد يكون من الضروري تضمين صفوف النتيجة التي لا تحتوي على صفوف مرتبطة في جدول آخر (أي جميع يتم تحديد صفوف من جدول واحد وإضافة الأسطر ذات الصلة فقط من جدول آخر). يسمى الاتصال من هذا النوع بالخارجي. لهذا، يتم استخدام الكلمات الأساسية OUTER JOIN ... ON ... مع البادئة LEFT أو RIGHT.

لنأخذ مثالاً، بعد أن قمنا مسبقًا بإضافة بائع جديد - Semuel Piter، الذي ليس لديه مبيعات بعد، إلى الجدول Sellers:

Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2 
LEFT OUTER JOIN Sumproduct 
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name

وبهذا الطلب قمنا باستخراج قائمة جميع البائعين في قاعدة البيانات وحساب إجمالي كمية البضائع المباعة لهم لجميع الأشهر. نرى أنه لا توجد مبيعات للبائع الجديد Semuel Piter. إذا استخدمنا صلة داخلية، فلن نرى البائع الجديد، لأنه ليس لديه سجلات في الجدول Sumproduct. يمكننا أيضًا تغيير اتجاه المجموعة ليس فقط عن طريق الكتابة LEFT أو RIGHT، ولكن أيضًا عن طريق تغيير ترتيب الجداول (أي أن السجلين التاليين سيعطيان نفس النتيجة: Sellers LEFT OUTER JOIN Sumproduct و Sumproduct RIGHT OUTER JOIN البائع_s).

أيضًا، تسمح بعض أنظمة إدارة قواعد البيانات (DBMS) بصلات خارجية في سجل مبسط باستخدام العلامتين *= و=*، والتي تتوافق مع LEFT OUTER JOIN وRIGHT OUTER JOIN، على التوالي. وبالتالي يمكن إعادة كتابة الاستعلام السابق على النحو التالي:

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City

لسوء الحظ، لا يدعم MS Access السجل المختصر للصلة الخارجية.

5. صلة خارجية كاملة (FULL OUTER JOIN)

يوجد أيضًا نوع آخر من الصلة الخارجية - صلة خارجية كاملة، والتي تعرض جميع الصفوف من كلا الجدولين وتربط فقط تلك التي يمكن أن تكون مرتبطة. بناء جملة الصلة الخارجية الكاملة كما يلي:

SELECT Seller_name, Product
FROM Sellers 
FULL OUTER JOIN Sumproduct 
ON Sellers.City = Sumproduct.City

مرة أخرى، الصلة الخارجية الكاملة غير مدعومة من قبل أنظمة إدارة قواعد البيانات التالية: MS Access، MySQL، SQL Server، وSybase. كيفية التغلب على هذا الظلم، سننظر في القسم التالي.