ما هي الصفوف التي يتم جلبها بواسطة عامل الربط الداخلي. لغة SQL - الانضمام. نموذجان نحويان لتنفيذ الاتصالات

يشرح هذا البرنامج التعليمي لـ Oracle كيفية الاستخدام ينضم(الداخلي والخارجي) في Oracle مع بناء الجملة والرسوم التوضيحية المرئية والأمثلة.

وصف

يتم استخدام Oracle JOINS لاسترداد البيانات من جداول متعددة. يتم تنفيذ Oracle JOIN عند ضم جدولين أو أكثر في عبارة SQL.

هناك 4 أنواع مختلفة من انضمامات Oracle:

  • Oracle INNER JOIN (أو يُطلق عليها أحيانًا صلة بسيطة)
  • Oracle LEFT OUTER JOIN (أو يُطلق عليها أحيانًا LEFT JOIN)
  • Oracle RIGHT OUTER JOIN (أو يُطلق عليها أحيانًا RIGHT JOIN)
  • Oracle FULL OUTER JOIN (أو يُطلق عليها أحيانًا FULL JOIN)

لذلك دعونا نناقش بناء جملة Oracle JOIN، وننظر إلى الرسوم التوضيحية المرئية لـ Oracle JOINS، ونستكشف أمثلة Oracle JOIN.

الانضمام الداخلي (انضمام بسيط)

من المحتمل أنك قد كتبت بالفعل عبارة تستخدم Oracle INNER JOIN. وهو أكثر أنواع الصلة شيوعًا. تقوم Oracle INNER JOINS بإرجاع كافة الصفوف من جداول متعددة حيث يتم استيفاء شرط الصلة.

بناء الجملة

بناء جملة INNER JOIN في Oracle/PLSQL هو:

حدد الأعمدة من الجدول 1 INNER JOIN table2 ON table1.column = table2.column؛

التوضيح المرئي

في هذا الرسم التخطيطي المرئي، تقوم Oracle INNER JOIN بإرجاع المنطقة المظللة:

ستقوم Oracle INNER JOIN بإرجاع السجلات حيث الجدول 1و الجدول 2تتقاطع.

مثال

فيما يلي مثال على Oracle INNER JOIN:

سيعيد مثال Oracle INNER JOIN هذا جميع الصفوف من جداول الموردين والأوامر حيث توجد قيمة معرف المورد المطابقة في كل من جداول الموردين والأوامر.

دعونا نلقي نظرة على بعض البيانات لشرح كيفية عمل INNER JOINS:

لدينا طاولة تسمى الموردين

واسم المورد اسم المورد
10000 آي بي إم
10001 هيوليت باكارد
10002 مايكروسوفت
10003 نفيديا

لدينا جدول آخر يسمى طلبات

رقم التعريف الخاص بالطلب واسم المورد تاريخ الطلب
500125 10000 2003/05/12
500126 10001 2003/05/13
500127 10004 2003/05/14

إذا قمنا بتشغيل عبارة Oracle SELECT (التي تحتوي على INNER JOIN) أدناه:

حدد الموردين.supplier_id، الموردين.supplier_name،orders.order_date من الموردين طلبات الانضمام الداخلية على الموردين.supplier_id =orders.supplier_id;

واسم المورد اسم تاريخ الطلب
10000 آي بي إم 2003/05/12
10001 هيوليت باكارد 2003/05/13

الصفوف ل مايكروسوفتو نفيديامن جدول المورد، نظرًا لأن معرف المورد 10002 و10003 غير موجود في كلا الجدولين. سيتم حذف صف 500127 (معرف_الطلب) من جدول الطلبات، نظرًا لأن معرف_المورد 10004 غير موجود في جدول الموردين.

بناء الجملة القديم

كملاحظة أخيرة، تجدر الإشارة إلى أنه يمكن إعادة كتابة مثال Oracle INNER JOIN أعلاه باستخدام بناء الجملة الضمني الأقدم على النحو التالي (لكننا ما زلنا نوصي باستخدام بناء جملة الكلمة الأساسية INNER JOIN):

حدد الموردين.supplier_id، الموردين.supplier_name،orders.order_date من الموردين، أوامر حيث الموردين.supplier_id =orders.supplier_id;

ترك صلة خارجية

هناك نوع آخر من الارتباط يسمى Oracle LEFT OUTER JOIN. يقوم هذا النوع من الربط بإرجاع كافة الصفوف من الجدول الأيسر المحدد في شرط التشغيل و فقط

بناء الجملة

بناء الجملة لأوراكل ترك صلة خارجيةيكون:

حدد الأعمدة من الجدول 1 الانضمام الأيسر إلى الجدول 2 على table1.column = table2.column؛

في بعض قواعد البيانات، يتم استبدال الكلمات الأساسية LEFT OUTER JOIN بـ LEFT JOIN.

التوضيح المرئي

في هذا الرسم التخطيطي المرئي، تقوم Oracle LEFT OUTER JOIN بإرجاع المنطقة المظللة:

ستعيد Oracle LEFT OUTER JOIN جميع السجلات من الجدول 1وفقط تلك السجلات من الجدول 2التي تتقاطع مع الجدول 1.

مثال

فيما يلي مثال على Oracle LEFT OUTER JOIN:

سيعيد مثال LEFT OUTER JOIN هذا جميع الصفوف من جدول الموردين وتلك الصفوف فقط من جدول الطلبات حيث تتساوى الحقول المرتبطة.

> في مجموعة النتائج

دعونا نلقي نظرة على بعض البيانات لشرح كيفية عمل LEFT OUTER JOINS:

لدينا طاولة تسمى الموردينمع حقلين (معرف_المورد واسم_المورد). ويحتوي على البيانات التالية:

واسم المورد اسم المورد
10000 آي بي إم
10001 هيوليت باكارد
10002 مايكروسوفت
10003 نفيديا

طلباتبثلاثة حقول (معرف_الطلب، ومعرف_المورد، وتاريخ_الطلب). ويحتوي على البيانات التالية:

رقم التعريف الخاص بالطلب واسم المورد تاريخ الطلب
500125 10000 2003/05/12
500126 10001 2003/05/13

إذا قمنا بتشغيل عبارة SELECT (التي تحتوي على LEFT OUTER JOIN) أدناه:

حدد الموردين.supplier_id، الموردين.supplier_name،orders.order_date من الموردين أوامر الانضمام الخارجية اليسرى على الموردين.supplier_id =orders.supplier_id;

ستبدو مجموعة النتائج لدينا كما يلي:

واسم المورد اسم المورد تاريخ الطلب
10000 آي بي إم 2003/05/12
10001 هيوليت باكارد 2003/05/13
10002 مايكروسوفت
10003 نفيديا

الصفوف ل مايكروسوفتو نفيدياسيتم تضمينه لأنه تم استخدام LEFT OUTER JOIN. ومع ذلك، ستلاحظ أن الحقل order_date لهذه السجلات يحتوي على قيمة.

بناء الجملة القديم

كملاحظة أخيرة، تجدر الإشارة إلى أنه يمكن إعادة كتابة مثال LEFT OUTER JOIN أعلاه باستخدام بناء الجملة الضمني الأقدم الذي يستخدم عامل الربط الخارجي (+) على النحو التالي (لكننا ما زلنا نوصي باستخدام بناء جملة الكلمة الأساسية LEFT OUTER JOIN):

حدد الموردين.supplier_id، الموردين.supplier_name،orders.order_date من الموردين، أوامر حيث الموردين.supplier_id =orders.supplier_id(+);

الانضمام الخارجي الصحيح

هناك نوع آخر من الارتباط يسمى Oracle RIGHT OUTER JOIN. يقوم هذا النوع من الربط بإرجاع كافة الصفوف من الجدول الأيمن المحدد في شرط التشغيل و فقطتلك الصفوف من الجدول الآخر حيث تكون الحقول المرتبطة متساوية (تم استيفاء شرط الربط).

بناء الجملة

بناء الجملة لأوراكل الانضمام الخارجي الصحيحيكون:

حدد الأعمدة من الجدول 1 للانضمام إلى الجدول 2 على الجدول 1. العمود = الجدول 2. العمود ؛

في بعض قواعد البيانات، يتم استبدال الكلمات الأساسية RIGHT OUTER JOIN بـ RIGHT JOIN.

التوضيح المرئي

في هذا الرسم التخطيطي المرئي، تقوم Oracle RIGHT OUTER JOIN بإرجاع المنطقة المظللة:

ستعيد Oracle RIGHT OUTER JOIN جميع السجلات من الجدول 2وفقط تلك السجلات من الجدول 1التي تتقاطع مع الجدول 2.

مثال

فيما يلي مثال على Oracle RIGHT OUTER JOIN:

سيعيد مثال RIGHT OUTER JOIN هذا جميع الصفوف من جدول الطلبات وفقط تلك الصفوف من جدول الموردين حيث تكون الحقول المرتبطة متساوية.

إذا كانت قيمة معرف المورد في جدول الطلبات غير موجودة في جدول الموردين، فسيتم عرض كافة الحقول في جدول الموردين على أنها > في مجموعة النتائج

دعونا نلقي نظرة على بعض البيانات لشرح كيفية عمل RIGHT OUTER JOINS:

لدينا طاولة تسمى الموردينمع حقلين (معرف_المورد واسم_المورد). ويحتوي على البيانات التالية:

واسم المورد اسم المورد
10000 تفاحة
10001 جوجل

لدينا جدول ثان يسمى طلباتبثلاثة حقول (معرف_الطلب، ومعرف_المورد، وتاريخ_الطلب). ويحتوي على البيانات التالية:

رقم التعريف الخاص بالطلب واسم المورد تاريخ الطلب
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10002 2013/08/14

إذا قمنا بتشغيل عبارة SELECT (التي تحتوي على RIGHT OUTER JOIN) أدناه:

حدد Orders.order_id، وorders.order_date، وموردون.supplier_name من الموردين مباشرة، انضم إلى الطلبات الخارجية على الموردين.supplier_id = Orders.supplier_id؛

ستبدو مجموعة النتائج لدينا كما يلي:

رقم التعريف الخاص بالطلب تاريخ الطلب اسم المورد
500125 2013/08/12 تفاحة
500126 2013/08/13 جوجل
500127 2013/08/14

الصف ل 500127 سيتم تضمين (order_id) لأنه تم استخدام RIGHT OUTER JOIN. ومع ذلك، ستلاحظ أن حقل اسم_المورد لهذا السجل يحتوي على قيمة.

بناء الجملة القديم

كملاحظة أخيرة، تجدر الإشارة إلى أنه يمكن إعادة كتابة مثال RIGHT OUTER JOIN أعلاه باستخدام بناء الجملة الضمني الأقدم الذي يستخدم عامل الربط الخارجي (+) على النحو التالي (لكننا ما زلنا نوصي باستخدام بناء جملة الكلمة الأساسية RIGHT OUTER JOIN):

حدد Orders.order_id، وorders.order_date، وموردون.supplier_name من الموردين، وأوامر حيث الموردون.supplier_id(+) = Orders.supplier_id;

الانضمام الخارجي الكامل

هناك نوع آخر من الارتباط يسمى Oracle FULL OUTER JOIN. يقوم هذا النوع من الربط بإرجاع كافة الصفوف من الجدول الأيسر والجدول الأيمن مع القيم الخالية في المكان الذي لم يتم استيفاء شرط الربط فيه.

بناء الجملة

بناء الجملة لأوراكل الانضمام الخارجي الكامليكون:

حدد الأعمدة من الجدول 1 الانضمام الكامل إلى الجدول 2 على table1.column = table2.column؛

في بعض قواعد البيانات، يتم استبدال الكلمات الأساسية FULL OUTER JOIN بـ FULL JOIN.

التوضيح المرئي

في هذا الرسم التخطيطي المرئي، تقوم Oracle FULL OUTER JOIN بإرجاع المنطقة المظللة:

ستقوم Oracle FULL OUTER JOIN بإرجاع كافة السجلات من كليهما الجدول 1و الجدول 2.

مثال

فيما يلي مثال على Oracle FULL OUTER JOIN:

هذا المثال FULL OUTER JOIN سيعيد جميع الصفوف من جدول الموردين وجميع الصفوف من جدول الطلبات وعندما لا يتم استيفاء شرط الربط، سيتم توسيعه ليشمل تلك الحقول في مجموعة النتائج.

إذا كانت قيمة معرف المورد في جدول الموردين غير موجودة في جدول الطلبات، فسيتم عرض كافة الحقول في جدول الطلبات على أنها > في مجموعة النتائج إذا كانت قيمة معرف المورد في جدول الطلبات غير موجودة في جدول الموردين، فسيتم عرض كافة الحقول في جدول الموردين على أنها في مجموعة النتائج

دعونا نلقي نظرة على بعض البيانات لشرح كيفية عمل الروابط الخارجية الكاملة:

لدينا طاولة تسمى الموردينمع حقلين (معرف_المورد واسم_المورد). ويحتوي على البيانات التالية:

واسم المورد اسم المورد
10000 آي بي إم
10001 هيوليت باكارد
10002 مايكروسوفت
10003 نفيديا

لدينا جدول ثان يسمى طلباتبثلاثة حقول (معرف_الطلب، ومعرف_المورد، وتاريخ_الطلب). ويحتوي على البيانات التالية:

رقم التعريف الخاص بالطلب واسم المورد تاريخ الطلب
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10004 2013/08/14

إذا قمنا بتشغيل عبارة SELECT (التي تحتوي على صلة خارجية كاملة) أدناه:

حدد الموردين.supplier_id، الموردين.supplier_name،orders.order_date من الموردين طلبات الانضمام الخارجي الكاملة على الموردين.supplier_id =orders.supplier_id;

ستبدو مجموعة النتائج لدينا كما يلي:

واسم المورد اسم المورد تاريخ الطلب
10000 آي بي إم 2013/08/12
10001 هيوليت باكارد 2013/08/13
10002 مايكروسوفت
10003 نفيديا
2013/08/14

الصفوف ل مايكروسوفتو نفيدياسيتم تضمينه لأنه تم استخدام FULL OUTER JOIN. ومع ذلك، ستلاحظ أن الحقل order_date لهذه السجلات يحتوي على قيمة.

سيتم أيضًا تضمين صف المورد 10004 لأنه تم استخدام FULL OUTER JOIN. ومع ذلك، ستلاحظ أن حقل معرف_المورد واسم_المورد لهذه السجلات يحتوي على أ قيمة.

بناء الجملة القديم

كملاحظة أخيرة، تجدر الإشارة إلى أن مثال FULL OUTER JOIN أعلاه لا يمكن كتابته بالصيغة القديمة دون استخدام

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

حدد COLUMN_NAMES (1..N) من TABLE_NAME_1 انضم إلى TABLE_NAME_2 بشروط

يمكن أن يتبع رابط واحد أو أكثر مع عامل JOIN قسم WHERE أو HAVING اختياري، حيث يتم تحديد شرط التحديد، تمامًا كما هو الحال في استعلام SELECT البسيط. من الشائع في جميع أنظمة إدارة قواعد البيانات أنه في هذا البناء، بدلاً من JOIN، يمكن تحديد INNER JOIN، LEFT OUTER JOIN، RIGHT OUTER JOIN، FULL OUTER JOIN، CROSS JOIN (أو بدلاً من ذلك، فاصلة).

صلة داخلية

تم تصميم الاستعلام باستخدام عامل التشغيل INNER JOIN لربط الجداول وعرض الجدول الناتج الذي تتقاطع فيه البيانات تمامًا وفقًا للحالة المحددة بعد التشغيل.

JOIN البسيط يفعل نفس الشيء. وبالتالي، فإن كلمة INNER اختيارية.

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

جدول الأجزاء:

لاحظ أنه في جدول الأجزاء، تحتوي الكتب على Cat - رابط إلى فئة غير موجودة في جدول الفئات، وفي جدول الفئات، تحتوي المعدات على Cat_ID - مفتاح أساسي، رابط غير موجود في الأجزاء طاولة. ويشترط دمج البيانات من هذين الجدولين بحيث يحتوي الجدول الناتج على حقول القطعة والقط والسعر، بحيث تتداخل البيانات بالكامل حسب الشرط. الشرط هو تطابق بين معرف الفئة في جدول الفئات والارتباط إلى الفئة في جدول الأجزاء. للقيام بذلك، اكتب الطلب التالي:

SELECT PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.السعر من الأجزاء الداخلية لفئات الانضمام إلى PARTS.Cat = CATEGORIES.Cat_ID

جزءقطةسعر
شقق سكنية505 210,00
سيارات205 160,00
المجالس10 105,00
خزائن30 77,00

لا توجد كتب في الجدول الناتج لأن هذا السجل يشير إلى فئة غير موجودة في جدول الفئات، ومعدات لأن هذا السجل يحتوي على مفتاح خارجي في جدول الفئات لم تتم الإشارة إليه في جدول الأجزاء.

في بعض الحالات، عند الانضمام إلى الجداول، يمكنك إنشاء استعلامات أقل تعقيدًا باستخدام موجود المسندوبدون استخدام JOIN.

هناك قاعدة بيانات "المسرح". يحتوي جدول التشغيل على بيانات حول عمليات الإنتاج. طاولة الفريق - حول أدوار الممثلين. جدول الممثل يدور حول الممثلين. جدول المخرج - عن المخرجين. يمكن رؤية حقول الجدول والمفاتيح الأساسية والأجنبية في الشكل أدناه (انقر بزر الماوس الأيسر للتكبير).


مثال 3.عرض قائمة الممثلين الذين يلعبون أكثر من دور في العرض الواحد وعدد أدوارهم.

استخدم عامل التشغيل JOIN مرة واحدة. يستخدم امتلاك، المجموعة حسب .

فكرة. ينطبق عامل التشغيل HAVING على عدد الأدوار التي تحسبها الدالة التجميعية COUNT.

ترك صلة خارجية

تم تصميم الاستعلام باستخدام عامل التشغيل LEFT OUTER JOIN لربط الجداول وعرض جدول ناتج تتقاطع فيه البيانات بالكامل مع الشرط المحدد بعد التشغيل، ويتم استكمالها بسجلات من الجدول الأول (الأيسر)، حتى لو لم تكن كذلك تلبية الشرط. السجلات الموجودة في الجدول الأيسر والتي لا تستوفي الشرط سيكون لها قيمة عمود من الجدول الأيمن وهي NULL (غير محددة).

مثال 4.قاعدة البيانات والجداول هي نفسها كما في المثال 1.

للحصول على جدول ناتج تتقاطع فيه البيانات من جدولين تمامًا حسب الشرط ويتم استكمالها بجميع البيانات من جدول الأجزاء التي لا تستوفي الشرط، اكتب الاستعلام التالي:

SELECT PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.السعر من الأجزاء المتبقية من فئات الانضمام الخارجية إلى PARTS.Cat = CATEGORIES.Cat_ID

ستكون نتيجة الاستعلام الجدول التالي:

جزءقطةسعر
شقق سكنية505 210,00
سيارات205 160,00
المجالس10 105,00
خزائن30 77,00
كتب160 باطل

في الجدول الناتج، على عكس الجدول الموجود في المثال 1، توجد كتب، ولكن قيمة عمود السعر هي NULL، نظرًا لأن هذا السجل يحتوي على معرف فئة غير موجود في جدول الفئات.

الانضمام الخارجي الصحيح

تم تصميم الاستعلام باستخدام عامل التشغيل RIGHT OUTER JOIN لربط الجداول وعرض جدول ناتج تتقاطع فيه البيانات بالكامل مع الشرط المحدد بعد التشغيل، ويتم استكمالها بسجلات من الجدول الثاني (الأيمن)، حتى لو لم تكن كذلك تلبية الشرط. السجلات الموجودة في الجدول الأيمن والتي لا تستوفي الشرط سيكون لها قيمة عمود من الجدول الأيسر وهي NULL (غير محددة).

مثال 5.

للحصول على الجدول الناتج الذي تتقاطع فيه البيانات من جدولين بشكل كامل حسب الشرط ويتم استكمالها بجميع البيانات من جدول الفئات غير المستوفية للشرط، اكتب الاستعلام التالي:

SELECT PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.السعر من الأجزاء اليمنى إلى فئات الانضمام الخارجية على PARTS.Cat = CATEGORIES.Cat_ID

ستكون نتيجة الاستعلام الجدول التالي:

جزءقطةسعر
شقق سكنية505 210,00
سيارات205 160,00
المجالس10 105,00
خزائن30 77,00
باطل45 65,00

في الجدول الناتج، على عكس الجدول من المثال 1، يوجد سجل بالفئة 45 والسعر 65.00، لكن قيمة عمود الجزء هي NULL، نظرًا لأن هذا السجل يحتوي على معرف فئة لم تتم الإشارة إليه في جدول الأجزاء.

وصلة خارجية كاملة (وصلة خارجية كاملة)

تم تصميم استعلام باستخدام عامل التشغيل FULL OUTER JOIN لربط الجداول وعرض جدول ناتج تتقاطع فيه البيانات بالكامل مع الشرط المحدد بعد ON، ويتم استكمالها بسجلات من الجدولين الأول (يسار) والثاني (يمين)، حتى لو لم يستوفوا الشرط. السجلات التي لا تستوفي الشرط سيكون لها أعمدة من الجدول الآخر فارغة (غير محددة).

مثال 6.قاعدة البيانات والجداول هي نفسها كما في الأمثلة السابقة.

للحصول على الجدول الناتج، الذي تتقاطع فيه البيانات من الجدولين تمامًا حسب الشرط ويتم استكمالها بجميع البيانات من كل من جدول الأجزاء وجدول الفئات التي لا تستوفي الشرط، اكتب الاستعلام التالي:

حدد PARTS.Part، CATEGORIES.Cat_ID AS Cat، CATEGORIES. السعر من فئات الانضمام الخارجية الكاملة للأجزاء على PARTS.Cat = CATEGORIES.Cat_ID

ستكون نتيجة الاستعلام الجدول التالي:

جزءقطةسعر
شقق سكنية505 210,00
سيارات205 160,00
المجالس10 105,00
خزائن30 77,00
كتب160 باطل
باطل45 65,00

يحتوي الجدول الناتج على سجلات الكتب (من الجدول الأيسر) والفئة 45 (من الجدول الأيمن)، وأولهما له سعر غير محدد (عمود من الجدول الأيمن)، والثاني له جزء غير محدد (عمود من الجدول الأيسر).

الأسماء المستعارة للجداول المرتبطة

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

مثال 7.أعد كتابة الاستعلام من المثال 1 باستخدام الأسماء المستعارة للجداول المرتبطة.

الطلب سيكون كالتالي:

حدد P.Part، C.Cat_ID AS Cat، C.Price من الأجزاء P INNER JOIN CATEGORIES C على P.Cat = C.Cat_ID

سيعيد الاستعلام نفس الشيء مثل الاستعلام في المثال 1، لكنه أكثر إحكاما.

JOIN والانضمام إلى أكثر من جدولين

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

حدد COLUMN_NAMES (1..N) من TABLE_NAME_1 انضم إلى TABLE_NAME_2 بشروط انضم إلى TABLE_NAME_3 بشروط... انضم إلى TABLE_NAME_M بشروط

مثال 8.قاعدة البيانات هي نفسها كما في الأمثلة السابقة. في هذا المثال، سيتم إضافة جدول الإعلانات إلى جدولي الفئات والأجزاء، والذي يحتوي على بيانات حول الإعلانات المنشورة على البوابة. فيما يلي جزء من جدول الإعلانات، حيث يوجد من بين السجلات سجلات لتلك الإعلانات التي تنتهي فترة نشرها في 04/02/2018.

يساعدمعرف الجزءتاريخ البدءDate_endنص
21 1 "2018-02-11" "2018-04-20" "انا ابيع..."
22 1 "2018-02-11" "2018-05-12" "انا ابيع..."
... ... ... ... ...
27 1 "2018-02-11" "2018-04-02" "انا ابيع..."
28 2 "2018-02-11" "2018-04-21" "انا ابيع..."
29 2 "2018-02-11" "2018-04-02" "انا ابيع..."
30 3 "2018-02-11" "2018-04-22" "انا ابيع..."
31 4 "2018-02-11" "2018-05-02" "انا ابيع..."
32 4 "2018-02-11" "2018-04-13" "انا ابيع..."
33 3 "2018-02-11" "2018-04-12" "انا ابيع..."
34 4 "2018-02-11" "2018-04-23" "انا ابيع..."

لنتخيل أن اليوم هو "2018-04-02"، أي أن هذه القيمة تأخذ الدالة CURDATE() - التاريخ الحالي. تريد معرفة الفئات التي تنتمي إليها الإعلانات التي حدد موعد نشرها اليوم. أسماء الفئات موجودة فقط في جدول CATEGORIES، وتواريخ انتهاء صلاحية الإعلان موجودة فقط في جدول ADS. في جدول الأجزاء - أجزاء من الفئات (أو ببساطة الفئات الفرعية) للإعلانات المنشورة. ولكن يتم ربط جدول PARTS بواسطة المفتاح الخارجي Cat_ID بجدول CATEGORIES، ويتم ربط جدول ADS بواسطة المفتاح الخارجي Part_ID بجدول PARTS. لذلك، نقوم بربط ثلاثة جداول في استعلام واحد ويمكن تسمية هذا الاستعلام بسلسلة بأقصى قدر من الصحة.

الطلب سيكون كالتالي:

نتيجة الاستعلام هي جدول يحتوي على أسماء فئتين - "العقارات" و"النقل":

اسم_القطط
العقارات
ينقل

تقاطع الانضمام

يؤدي استخدام عبارة SQL CROSS JOIN في أبسط أشكالها - بدون شرط الصلة - إلى تنفيذ العملية المنتج الديكارتي في الجبر العلائقي. ستكون نتيجة هذا الربط هي تسلسل كل صف من الجدول الأول مع كل صف من الجدول الثاني. يمكن كتابة الجداول في استعلام إما من خلال عامل تشغيل CROSS JOIN أو فصلها بفاصلة.

مثال 9.قاعدة البيانات لا تزال هي نفسها، الجداول هي الفئات والأجزاء. تنفيذ عملية المنتج الديكارتي لهذين الجدولين.

الطلب سيكون كالتالي:

اختر (*) الفئات عبر الانضمام إلى الأجزاء

أو بدون تحديد CROSS JOIN بشكل صريح - مفصولة بفواصل:

اختر (*) الفئات والأجزاء

سيعيد الاستعلام جدولاً مكونًا من 5 * 5 = 25 صفًا، جزء منه موضح أدناه:

معرف_القططاسم_القططسعرمعرف الجزءجزءقطة
10 مواد بناء105,00 1 شقق سكنية505
10 مواد بناء105,00 2 سيارات205
10 مواد بناء105,00 3 المجالس10
10 مواد بناء105,00 4 خزائن30
10 مواد بناء105,00 5 كتب160
... ... ... ... ... ...
45 تقنية65,00 1 شقق سكنية505
45 تقنية65,00 2 سيارات205
45 تقنية65,00 3 المجالس10
45 تقنية65,00 4 خزائن30
45 تقنية65,00 5 كتب160

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

ولكن بالنسبة لـ CROSS JOIN، يمكنك تعيين شرط الانضمام! وستكون النتيجة مختلفة تماما. عند استخدام عامل الفاصلة بدلاً من التحديد الصريح لـ CROSS JOIN، لا يتم تحديد شرط الصلة بواسطة كلمة ON، ولكن بواسطة كلمة WHERE.

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

الطلب سيكون كالتالي:

سيعيد الاستعلام نفس الاستعلام في المثال 1:

جزءقطةسعر
شقق سكنية505 210,00
سيارات205 160,00
المجالس10 105,00
خزائن30 77,00

وهذه الصدفة ليست عرضية. الاستعلام ذو الصلة المتبادلة وفقًا لشرط الصلة يشبه تمامًا الاستعلام ذو الصلة الداخلية - INNER JOIN - أو، نظرًا لأن الكلمة INNER اختيارية، فما عليك سوى الانضمام.

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

قواعد البيانات العلائقية ولغة SQL

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

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

الانضمام إلى جملة المشغل

بناء جملة لتوصيل جدول إضافي باستعلام باستخدام عامل التشغيل ينضميمكن تمثيلها بالشكل التالي:

حدد الحقل 1، الحقل 1، [،... n] من الجدول 1 t1 (داخلي | (يسار | يمين | كامل) خارجي | متقاطع) انضم إلى الجدول 2 (تشغيل) | استخدام (اسم الحقل [،... ن]))

في معظم أنظمة إدارة قواعد البيانات (DBMS)، عند استخدام المشغل ينضمبالاشتراك مع الكلمات الأساسية LEFT، RIGHT، FULL، يمكن حذف المعامل OUTER. لا يلزم أيضًا استخدام المعامل INNER في معظم أنظمة إدارة قواعد البيانات (DBMS).

إذا كانت أسماء الأعمدة التي يتم من خلالها ربط الجداول هي نفسها، فيمكنك استخدامها بدلاً من ON استخدام. للمشغل تقاطع الانضماملم يتم تحديد الشرط.

جداول الاختبار للتحقق من JOIN

لمزيد من الأمثلة، سنقوم بإنشاء جدولين اختبار بسيطين. الجداول المرجعية للمستخدمين ومركباتهم. سيقوم الجدول الأول بتخزين معرف المستخدم واسمه (اللقب). يحتوي الجدول الثاني على قائمة السيارات (المعرف، الاسم) ومعرف أصحابها/مستخدميها. وتجدر الإشارة إلى أنه قد يكون لدى المستخدم عدة سيارات أو قد لا يمتلك أي منها على الإطلاق.

جدول المستخدم

إنشاء مستخدمي الجدول (المعرف int ليس فارغًا، الاسم varchar(32) ليس فارغًا، المفتاح الأساسي (id)); - أدخل عدة سجلات في الجدول، أدخل في قيم المستخدمين (المعرف، الاسم) (1، "أليكس")؛ إدراج في قيم (المعرف والاسم) للمستخدمين (2، "piter")؛ أدخل في قيم (المعرف والاسم) للمستخدمين (3، "serg")؛ أدخل في قيم (المعرف والاسم) للمستخدمين (4، "olga")؛ أدخل في قيم (المعرف والاسم) للمستخدمين (5، "ostap")؛

طاولة سيارة

إنشاء جدول تلقائي (id int ليس فارغًا، - اسم المعرف التلقائي varchar(32) ليس فارغًا، - اسم تلقائي oid int ليس فارغًا، - المفتاح الأساسي لمعرف المالك (id))؛ - أدخل عدة سجلات في الجدول، أدخل في قيم السيارات (المعرف، المعرف، الاسم) (1، 1، "تويوتا كامري")؛ أدخل في قيم السيارات (المعرف، المعرف، الاسم) (2، 1، "تويوتا برادو")؛ أدخل في قيم السيارات (المعرف، المعرف، الاسم) (3، 2، "رينو ميجان")؛ أدخل في قيم السيارات (المعرف، المعرف، الاسم) (4، 3، "نيسان إكس تريل")؛ أدخل في قيم السيارات (المعرف، المعرف، الاسم) (5، 4، "سوزوكي سويفت")؛ أدخل في قيم السيارات (المعرف، المعرف، الاسم) (6، 4، "سوزوكي فيتارا")؛

الانضمام الداخلي، الانضمام الداخلي

صلة داخليةهو عامل ربط داخلي بين جدولين. إنها متماثلة، لذا فإن ترتيب الجداول ليس مهمًا بالنسبة للمشغل.

ملائم صلة داخليةلاسترداد فقط تلك الصفوف التي يوجد بها مراسلات بين السجلات في الجداول الرئيسية والجداول المرتبطة. خوارزمية توليد النتيجة: تتم مقارنة كل صف من الجدول الرئيسي بكل صف من الجدول المرتبط. بعد ذلك، يتم التحقق من حالة الاتصال. إذا كان الشرط صحيحًا، فسيتم إضافة الصف "المنضم" المقابل إلى مجموعة النتائج.

الاستعلام مع اختيار أعمدة مجموعة النتائج حدد u.name كمالك، وa.name كـ auto من المستخدمين u الداخلي الانضمام التلقائي a ON a.oid = u.id - مالك نتيجة الاستعلام auto alex toyota camry alex toyota pradopiter renault ميجان سيرج نيسان إكس تريل أولجا سوزوكي سويفت أولجا سوزوكي فيتارا - الاستعلام دون تحديد أعمدة مجموعة النتائج حدد * من المستخدمين u الانضمام الداخلي السيارات a ON a.oid = u.id - اسم معرف نتيجة الاستعلام id1 name1 oid 1 alex 1 تويوتا كامري 1 1 اليكس 2 تويوتا برادو 1 2 بيتر 3 رينو ميجان 2 3 سيرج 4 نيسان اكس تريل 3 4 أولجا 5 سوزوكي سويفت 4 4 أولجا 6 سوزوكي فيتارا 4

للحصول على بيانات لا تطابق الشرط، يجب عليك استخدام صلة خارجية - الانضمام الخارجي.

الانضمام الخارجي، الانضمام الخارجي

عند الانضمام إلى جدولين باستخدام عامل التشغيل الانضمام الخارجيستتضمن مجموعة النتائج بالضرورة صفوفًا من أحد الجدولين أو كلا الجدولين. يمكن حذف الكلمة الأساسية OUTER. تدوين LEFT JOIN مطابق لـ LEFT OUTER JOIN.

هناك نوعان من الصلة الخارجية. هذا ترك صلة خارجيةو الانضمام الخارجي الصحيح. يعمل هؤلاء المشغلون بنفس الطريقة. الفرق هو أنه عند استخدام LEFT JOIN، يكون الجدول الأساسي هو الجدول المحدد بعد عبارة FROM. في ظل ظروف محددة، تتم إضافة بيانات الجدول المرتبط إلى صفوف هذا الجدول. بالنسبة لمشغل RIGHT OUTER JOIN، كل شيء هو عكس ذلك تمامًا.

عامل الانضمام الخارجي الانضمام الخارجيغير متماثل، لذا فإن الترتيب الذي يتم به إنشاء العلاقة بين الجداول مهم بالنسبة للمشغل.

مثال على استخدام عامل التشغيل LEFT OUTER JOIN

حدد u.name كمالك، وa.name كـ auto من المستخدمين الذين تركتهم انضم إلى autos a ON a.oid = u.id - مالك نتيجة الاستعلام auto alex toyota camry alex toyota pradopiter renault megane serg nissan x-trail olga suzuki Swift أولغا سوزوكي فيتارا أوستاب

بيانياً، يمكن تمثيل نتيجة العمل على النحو التالي:

LEFT OUTER JOIN عامل التشغيل مع التصفية

عن طريق إضافة الشرط “حيث يكون a.name فارغًا” إلى الكود في المثال السابق. لن يكون هناك سوى سجل واحد "ostap" متبقي في التحديد، لأنه السجل الوحيد الذي لا يحتوي على سيارة محددة.

بيانياً، يمكن تمثيل نتيجة العمل على النحو التالي:

مشغل الانضمام المتقاطع، CROSS JOIN

CROSS JOIN هو عامل ربط متقاطع (منتج ديكارتي). المشغل متماثل وترتيب الجداول ليس مهمًا بالنسبة للمشغل.

يتم تشكيل مجموعة النتائج على النحو التالي: يتم ربط كل صف من جدول واحد بكل صف من الجدول الثاني، مما يؤدي إلى جميع المجموعات الممكنة لصفوف الجدولين. على سبيل المثال، يؤدي هذا إلى 30 صفًا من مجموعة النتائج.

اختر * من المستخدمين عبر الانضمام إلى السيارات - اسم معرف نتيجة الاستعلام id1 name1 oid 1 alex 1 toyota camry 1 2piter 1 toyota camry 1 3 serg 1 toyota camry 1 4 olga 1 toyota camry 1 5 ostap 1 toyota camry 1 1 alex 2 toyota برادو 1 2 بيتر 2 تويوتا برادو 1 3 سيرج 2 تويوتا برادو 1 4 أولغا 2 تويوتا برادو 1 5 أوستاب 2 تويوتا برادو 1. . .

يتم عرض أول 12 سطرًا فقط في نتائج الكتابة.

تدعم Oracle عدة أنواع من الصلات، والتي تختلف في طريقة ربط الصفوف من جدولين أو طرق عرض أو أكثر. سيصف منشور المدونة هذا أنواع الاتصال الأكثر استخدامًا في Oracle.

اتصال متساوي

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

SQL> SELECT e.last_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;

يمكن لعامل الربط الموضح أعلاه أيضًا استخدام بناء الجملة الجديد التالي:

SQL> SELECT e.last_name, d.dept FROM emp e JOIN dept d USING (emp_id);

إذا كنت تريد توصيل أعمدة متعددة، يمكنك إدراج أسمائها كقائمة مفصولة بفواصل، على سبيل المثال: USING (dept_id، emp_name).

اتصال طبيعي

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

SQL> SELECT e.last_name، d.dept FROM emp e NATURAL JOIN dept d؛

في هذا المثال، شرط الربط هو أن عمود الاسم الأخير في جدولي emp وdept يجب أن يحتوي على قيم متطابقة.

اتصال انعكاسي

الصلة الانعكاسية تعني ضم الجدول إلى نفسه من خلال استخدام الأسماء المستعارة. يقوم المثال التالي بربط جدول الموظفين بنفسه باستخدام اسم مستعار وإزالة كافة الصفوف المكررة.

SQL> حذف من الموظفين X WHERE ROWID > 2 (اختر MIN(rowid) من الموظفين Y 3 حيث X.key_values ​​​​= Y.key_values)؛

صلة داخلية

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

SQL> SELECT e.flast_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;

تتيح لك Oracle الآن تحديد معايير الانضمام في بناء جملة الانضمام الداخلي (أو البسيط) باستخدام بنية ON أو USING جديدة، على سبيل المثال:

SQL> حدد DISTINCT NVL(dname, "No Dept"), COUNT(empno) nbr_emps FROM emp JOIN DEPT ON emp.deptno = dept.deptno حيث emp.job IN ("MANAGER"، "SALESMAN"، "ANALYST") المجموعة بواسطة الاسم؛

الانضمام الخارجي

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

دعونا نستمر في تعلم الأساسيات SQL، وحان الوقت للحديث عن عمليات الصلات البسيطة. واليوم سننظر في كيفية دمج البيانات عن طريق المشغلين الانضمام الأيسر، الانضمام الأيمن، الانضمام المتقاطع، الانضمام الداخليبمعنى آخر، سوف نتعلم كتابة الاستعلامات التي تجمع بين البيانات، وكالعادة سندرس كل هذا مع الأمثلة.

تعد عمليات JOIN مهمة جدًا في SQL، لأنه بدون القدرة على كتابة استعلامات تجمع بين البيانات من كائنات مختلفة، فإن مبرمج SQL، وحتى مجرد مسؤول يقوم من وقت لآخر بتفريغ بعض البيانات من قاعدة البيانات، ببساطة لا يمكنه الاستغناء عنها، لذلك هذا ينطبق على أساسيات SQL ويجب على كل شخص يتعامل مع SQL أن يكون لديه فكرة عما هي عليه.

ملحوظة!سنكتب جميع الأمثلة في Management Studio SQL Server 2008.

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

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

وسنبدأ كالعادة بنظرية صغيرة.

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

SQL اليسار واليمين الانضمام

الانضمام الأيسر- هذا عبارة عن مجموعة من البيانات بواسطة المفتاح الأيسر، أي. لنفترض أننا نقوم بربط جدولين باستخدام وصلة يسارية، وهذا يعني أنه سيتم سحب كافة البيانات من الجدول الثاني إلى الأول، وإذا لم يكن هناك مفتاح، سيتم عرض القيم NULL، بمعنى آخر، الكل سيتم عرض البيانات من الجدول الأيسر وجميع البيانات حسب المفتاح من الجدول الأيمن.

الانضمام الصحيح- هذه هي نفس الصلة مثل الصلة اليسرى، وسيتم عرض جميع البيانات من الجدول الأيمن فقط وتلك البيانات من الجدول الأيسر التي تحتوي على مفتاح الصلة فقط.

الآن دعونا نلقي نظرة على الأمثلة، ونقوم أولاً بإنشاء جدولين:

إنشاء جدول ( (18, 0) NULL، (50) NULL) أثناء التنقل إنشاء جدول ( (18، 0) NULL، (50) NULL) ON GO

وإليكم هذه الجداول البسيطة، وعلى سبيل المثال، قمت بملئها بالبيانات التالية:

لنكتب الآن استعلامًا يربط هذه الجداول بواسطة مفتاح الرقم، بدءًا من LEFT:

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text من test_table t1 LEFT JOIN test_table_2 t2 ON t1.number=t2.number

كما ترون، هنا يتم إخراج جميع البيانات من الجدول t1، ولكن ليس كل البيانات من الجدول t2، نظرًا لأن الصف الذي يحتوي على الرقم = 4 غير موجود، لذلك يتم إخراج القيم الخالية.

ماذا سيحدث إذا قمنا بالدمج باستخدام صلة صحيحة، وسيكون الأمر كما يلي:

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text FROM test_table t1 RIGHT JOIN test_table_2 t2 ON t1.number=t2.number

بمعنى آخر، تم عرض جميع الصفوف من الجدول t2 والسجلات المقابلة من الجدول t1، نظرًا لأن جميع المفاتيح الموجودة في الجدول t2 موجودة أيضًا في الجدول t1، وبالتالي ليس لدينا قيم فارغة.

SQL INNER JOIN

صلة داخلية– هذا اتحاد عندما يتم عرض كافة السجلات من جدول واحد وجميع السجلات المقابلة من جدول آخر، ولن يتم عرض تلك السجلات غير الموجودة في جدول واحد أو آخر، أي. فقط تلك السجلات التي تطابق المفتاح. بالمناسبة، سأقول على الفور أن الانضمام الداخلي هو نفسه مجرد الانضمام بدون Inner. مثال:

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text FROM test_table t1 INNER JOIN test_table_2 t2 على t1.number=t2.number

الآن دعونا نحاول دمج جداولنا باستخدام مفتاحين. للقيام بذلك، دعونا نتذكر قليلاً كيفية إضافة عمود إلى جدول وكيفية تحديث البيانات باستخدام التحديث، نظرًا لأن جداولنا تحتوي على عمودين فقط، والدمج بواسطة حقل نصي هو بطريقة ما ليس جيدا. للقيام بذلك، قم بإضافة أعمدة:

تغيير الجدول test_table إضافة number2 INT ALTER TABLE test_table_2 إضافة number2 INT

لنقم بتحديث بياناتنا، ما عليك سوى وضع القيمة 1 في العمود رقم 2:

تحديث test_table SET number2 = 1 تحديث test_table_2 SET number2 = 1

ولنكتب استعلامًا باتحاد يعتمد على مفتاحين:

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text FROM test_table t1 INNER JOIN test_table_2 t2 ON t1.number=t2.number وt1.number2=t2.number2

وستكون النتيجة هي نفسها كما في المثال السابق:

ولكن إذا قمنا، على سبيل المثال، في الجدول الثاني في صف واحد، بتغيير الحقل رقم 2 إلى القيمة، على سبيل المثال 2، فستكون النتيجة مختلفة تمامًا.

تحديث test_table_2 مجموعة number2 = 2 حيث الرقم = 1

الطلب هو نفسه، ولكن هذه هي النتيجة:

كما ترون، بالنسبة للمفتاح الثاني، لم نحصل على سطر واحد.

SQL عبر الانضمام

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

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text FROM test_table t1 CROSS JOIN test_table_2 t2

هنا، يتوافق كل صف من جدول test_table مع كل صف من جدول test_table_2، أي. في الجدول test_table لدينا 4 صفوف، وفي الجدول test_table_2 3 صفوف 4 اضرب 3 وسيكون الناتج 12، تمامًا كما حصلنا على 12 صفًا.

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

حدد t1.number كـ t1_number، t1.text كـ t1_text، t2.number كـ t2_number، t2.text كـ t2_text، t3.number كـ t3_number، t3.text كـ t3_text، t4.number كـ t4_number، t4.text كـ t4_text من test_table t1 الانضمام الأيسر test_table_2 t2 على t1.number=t2.number الانضمام الأيمن test_table_2 t3 على t1.number=t3.number الانضمام الداخلي test_table_2 t4 على t1.number=t4.number

كما ترون، هنا أقوم بدمج كل من اليسار واليمين والداخلي فقط لتوضيح الأمر.

أعتقد أن هذا يكفي مع النقابات، خاصة أنه لا يوجد فيها شيء معقد. ولكن هذه ليست نهاية تعلم SQL، سنستمر في المقالات التالية، ولكن في الوقت الحالي، قم بالتدرب على الاستعلامات الخاصة بك وكتابتها. حظ سعيد!