أمثلة الانضمام البسيطة. MySQL JOIN: وصف ومثال لاستخدام الأمر والتوصيات، وترك تحديث MySQL أمثلة على الانضمام

أمثلة الانضمام البسيطة. MySQL JOIN: وصف ومثال لاستخدام الأمر والتوصيات، وترك تحديث MySQL أمثلة على الانضمام

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

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

    سوف أقوم بإرفاق ملفات من موقعنا بالمقالة، ومن بينها ملف join.php الذي سأعرض فيه كافة السجلات باستخدام مشغلي JOIN المختلفين.

    صلة داخلية

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

    جدول الرسائل:

    سيكون الاستعلام مع JOIN كما يلي:

    اختر * من الرسائل INNER JOIN Files ON messages.fid=Files.fid

    ونتيجة لذلك، سيتم عرض السجلات التالية:

    جدول الملفات:

    ستكون هناك حاجة إلى LEFT JOIN عندما نعرض جميع سجلات الرسائل، وما إذا كان هناك ملف مرفق أم لا، فسوف نتحقق من خلال PHP.

    LEFT JOIN بدون تقاطعات مع الجدول الأيمن

    تقوم LEFT JOIN بإرجاع كافة السجلات من الجدول الأيسر، باستثناء السجلات التي يتطابق فيها fid في الجدول الأيمن.

    جدول الرسائل:

    سيكون الاستعلام الذي يحتوي على LEFT JOIN بدون تقاطعات:

    حدد * من الرسائل، انضم إلى الملفات الموجودة على الرسائل.fid=Files.fid حيث يكون Files.fid فارغًا

    ونتيجة لذلك نحصل على العينة التالية:

    جدول الملفات:

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

    الانضمام إلى اليمين دون التقاطعات

    يعرض RIGHT JOIN بدون تقاطعات كافة السجلات من الجدول الأيمن، باستثناء تلك التي تحتوي على تقاطعات مع الجدول الأيسر.

    جدول الرسائل:

    سيكون الاستعلام ذو الصلة اليمنى بدون تقاطعات:

    حدد * من الرسائل، انضم إلى الملفات مباشرة على الرسائل.fid=Files.fid حيث تكون الرسائل.fid فارغة

    بهذه الطريقة سنحصل على البيانات التالية:

    منتصف bodytext فيد طريق
    باطل باطل 1 /الملفات/1.png

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

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

    على الرغم من أن SQL يحتوي على عامل FULL OUTER JOIN، إلا أن MySQL لا يحتوي على هذا العامل. الحقيقة هي أن مثل هذا المشغل يمثل عبئًا كبيرًا على الخادم. الآن لدينا 3 ملفات و3 رسائل، في حين يتم تشكيل 4 أسطر نتيجة الطلب. لست متأكدًا مما إذا كانت فكرة كتابة استعلام يجمع بين استعلامين، LEFT JOIN وRIGHT JOIN، فكرة جيدة. ولكن لا يزال من الممكن محاكاة طلب الانضمام الخارجي الكامل.

    جدول الرسائل:

    ستكون محاكاة الطلب باستخدام FULL OUTER JOIN كما يلي:

    حدد * من الرسائل، ملفات الانضمام اليسرى على الرسائل.fid = Files.fid الاتحاد حدد * من الرسائل، ملفات الانضمام اليمنى على الرسائل.fid = Files.fid

    في هذا الاستعلام، نستخدم مشغل UNION لربط استعلامين LEFT JOIN وRIGHT JOIN.

    ونتيجة لذلك، سوف نحصل على السجلات التالية:

    منتصف bodytext فيد طريق
    1 امتحان 2 /الملفات/2.png
    2 أهلاً باطل باطل
    3 مرحبًا 3 /الملفات/3.png
    باطل باطل 1 /الملفات/1.png

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

    وصلة خارجية كاملة بدون تقاطعات

    هناك نوع آخر من JOIN أكثر جنونًا من مجرد FULL OUTER JOIN، وهو FULL OUTER JOIN بدون تقاطعات. لا أستطيع حتى أن أقترح أين يمكن استخدام هذا النوع من JOIN. لأنه نتيجة لذلك نتلقى ملفات غير مستخدمة ورسائل بدون ملفات. وكما خمنت على الأرجح، فإن هذا العامل غير موجود أيضًا في MySQL. كل ما تبقى هو محاكاته باستخدام عاملين: LEFT JOIN بدون تعدادات وRIGHT JOIN بدون تقاطعات.

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

    $sql = "SELECT * من الرسائل، الانضمام إلى الملفات اليسرى على الرسائل.fid = Files.fid حيث Files.fid NULL UNION SELECT * من الرسائل، الانضمام إلى الملفات اليمنى على الرسائل.fid = Files.fid حيث تكون الرسائل.fid NULL";

    ونتيجة لذلك (الجداول المصدر هي نفسها كما في المثال مع FULL OUTER JOIN) نحصل على:

    منتصف bodytext فيد طريق
    2 أهلاً باطل باطل
    باطل باطل 1 /الملفات/1.png

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

    9.5 ألف

    في هذه المقالة، سنغطي عامل تشغيل MySQL LEFT JOIN وكيفية استخدامه للاستعلام عن البيانات من جدولين أو أكثر من جداول قاعدة البيانات.

    مقدمة إلى LEFT JOIN MySQL

    يتيح لك مشغل MySQL LEFT JOIN الاستعلام عن البيانات من جدولين أو أكثر من جداول قاعدة البيانات. وهو جزء اختياري من عبارة SELECT التي تظهر بعد FROM.

    لنفترض أنك ستقوم بالاستعلام عن البيانات من الجدولين t1 وt2. باستخدام نموذج الاستعلام أدناه، نوضح بناء جملة LEFT JOIN من خلال ضم جدولين:

    حدد t1.c1، t1.c2، t2.c1، t2.c2 من t1 LEFT JOIN t2 ON t1.c1 = t2.c1؛

    عند الانضمام إلى الجدولين t1 وt2 باستخدام عامل التشغيل LEFT JOIN، إذا كان صف من الجدول الأيسر t1 يتطابق مع صف من الجدول الأيمن t2 بناءً على شرط الربط (t1.c1 = t2.c1)، فسيتم تضمين هذا الصف في مجموعة النتائج

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

    بمعنى آخر، يسمح لك شرط MySQL LEFT JOIN بتحديد الصفوف من كلا الجدولين المتطابقين، بالإضافة إلى جميع الصفوف من الجدول الأيسر (t1) حتى بدون مطابقة الصفوف من الجدول الأيمن (t2).

    سيساعدك الرسم البياني التالي على فهم كيفية عمل شرط LEFT JOIN. تقاطع الدائرتين هو الصفوف المتطابقة في كلا الجدولين، وما تبقى من الدائرة اليسرى هو الصفوف في الجدول t1 التي لا تحتوي على صف مناظر في الجدول t2. ولذلك، يتم تضمين كافة الصفوف الموجودة في الجدول الأيسر في مجموعة النتائج.


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

    لنأخذ جدولين للعملاء والطلبات من قاعدة البيانات التجريبية:


    في قاعدة البيانات الموضحة في الرسم البياني:
    • يجب أن ينتمي كل طلب في جدول الطلبات إلى عميل في جدول العملاء؛
    • يمكن أن يكون لدى كل عميل في جدول العملاء صفر طلبات أو أكثر في جدول الطلبات.

    للعثور على الطلبات الخاصة بكل عميل، يمكنك استخدام مثال MySQL LEFT JOIN:

    حدد c.customerNumber، c.customerName، orderNumber، o.status من العملاء c أوامر الانضمام اليسرى o ON c.customerNumber = o.customerNumber

    عرض المثال


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

    وبما أننا استخدمنا نفس اسم العمود (orderNumber) لربط الجدولين، فيمكننا جعل الاستعلام أقصر باستخدام بناء الجملة أدناه:

    حدد c.customerNumber وcustomerName وorderNumber والحالة من العملاء c أوامر الانضمام اليسرى باستخدام (customerNumber)؛

    إذا قمت باستبدال عبارة MySQL SELECT LEFT JOIN ببيان INNER JOIN، فلن تحصل إلا على العملاء الذين قدموا طلبًا واحدًا على الأقل.

    استخدام عامل MySQL LEFT JOIN للعثور على الصفوف غير المتطابقة

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

    على سبيل المثال، للعثور على جميع العملاء الذين لم يقدموا أي طلبات، استخدم الاستعلام التالي:

    عرض المثال

    الشرط في جملة WHERE أو الشرط في جملة ON

    خذ بعين الاعتبار المثال التالي باستخدام MySQL LEFT JOIN WHERE :

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

    تم تصميم مشغل 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

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

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

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


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

    استخدم عامل التشغيل JOIN مرة واحدة. استخدم HAVING، GROUP BY .

    فكرة. ينطبق عامل التشغيل 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

    يدعم MySQL بناء جملة عبارة JOIN التالية عند استخدامها في عبارات SELECT:

    Table_reference، table_reference table_reference الانضمام table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT JOIN table_reference join_condition table_reference LEFT JOIN table_reference table_reference NATURAL] الانضمام table_reference ( oj table_reference LEFT OUTER JOIN table_reference ON conditional_exp ص) table_reference الانضمام إلى اليمين table_reference join_condition table_reference الانضمام إلى اليمين table_reference table_reference NATURAL ] انضم إلى table_reference

    حيث يتم تعريف table_reference على النحو التالي:

    اسم_الجدول[الاسم المستعار]

    ويتم تعريف join_condition على النحو التالي:

    على conditional_expr | الاستخدام (column_list)

    يجب عليك عدم تحديد أي شروط في عبارة ON التي تفرض قيودًا على الصفوف في مجموعة النتائج. إذا كنت بحاجة إلى تحديد الصفوف التي يجب أن تكون موجودة في النتيجة، فيجب عليك القيام بذلك في جملة WHERE.

    يرجى ملاحظة أنه في الإصدارات السابقة لـ 3.23.17، لا يقبل عامل التشغيل INNER JOIN معلمة join_condition!

    إن وجود آخر الإنشاءات المذكورة أعلاه لتعبير LEFT OUTER JOIN يرجع فقط إلى متطلبات توافق ODBC:

    • بدلاً من مرجع الجدول، يمكن استخدام اسم مستعار، والذي يتم تعيينه باستخدام التعبيرات tbl_name AS alias_name أو tbl_name alias_name: mysql> SELECT t1.name, t2.salary FROM member AS t1, info AS t2 WHERE t1.name = t2. اسم؛
    • عبارة ON الشرطية هي شرط بأي شكل من الأشكال يمكن استخدامه في جملة WHERE.
    • إذا لم يتم العثور على إدخال للجدول الأيمن في أجزاء ON أو USING من LEFT JOIN، فسيتم استخدام صف مع تعيين جميع الأعمدة على NULL لهذا الجدول. يمكن استخدام هذه الميزة للعثور على نتائج في جدول ليس له ما يعادله في جدول آخر: mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL; يبحث هذا المثال عن كافة الصفوف في الجدول 1 بقيمة معرف غير موجودة في الجدول 2 (أي، جميع الصفوف في الجدول 1 التي لا توجد لها صفوف مقابلة في الجدول 2). بالطبع، هذا يفترض أنه تم الإعلان عن table2.id كـ NOT NULL . راجع القسم 5.2.6 كيف تقوم MySQL بتحسين LEFT JOIN وRIGHT JOIN.
    • يتم استخدام USING(column_list) لتحديد قائمة الأعمدة التي يجب أن تكون موجودة في كلا الجدولين. تعبير USING مثل: A LEFT JOIN B USING (C1,C2,C3,...) مطابق لغويًا لتعبير ON، على سبيل المثال: A.C1=B.C1 AND A.C2=B.C2 AND A .C3=ب .C3،...
    • يتم تعريف الصلة الطبيعية بين جدولين على أنها المعادل الدلالي للصلة الداخلية أو الصلة اليسرى مع عبارة الاستخدام التي تحدد جميع الأعمدة الموجودة في كلا الجدولين.
    • INNER JOIN و(فاصلة) معادلتان دلاليتان. يقوم كلاهما بإجراء صلة كاملة على الجداول المستخدمة. عادةً ما يتم تحديد طريقة ربط الجداول في جملة WHERE.
    • تعمل RIGHT JOIN بشكل مشابه لـ LEFT JOIN. للحفاظ على إمكانية نقل التعليمات البرمجية بين قواعد البيانات المختلفة، يوصى باستخدام LEFT JOIN بدلاً من RIGHT JOIN.
    • STRAIGHT_JOIN مطابق لـ JOIN، فيما عدا أن الجدول الأيسر تتم قراءته دائمًا قبل الجدول الأيمن. يمكن استخدام هذا التعبير لتلك الحالات (القليلة) التي يقوم فيها مُحسِّن الربط بوضع الجداول بترتيب خاطئ.
    • بدءًا من الإصدار 3.23.12 من MySQL، يمكنك توجيه MySQL إلى الفهرس الذي يجب استخدامه عند استرجاع المعلومات من الجدول. تكون هذه الميزة مفيدة إذا كانت عبارة EXPLAIN (التي تعرض معلومات حول بنية استعلام SELECT وترتيبها) تشير إلى أن MySQL تستخدم فهرسًا خاطئًا. من خلال تحديد قيمة فهرس في USE INDEX (key_list)، يمكنك إجبار MySQL على استخدام واحد فقط من الفهارس المحددة للبحث عن سجل. عبارة بديلة، IGNORE INDEX (key_list)، تمنع MySQL من استخدام هذا الفهرس المحدد. التعبيرات USE/IGNORE KEY هي مرادفات لـ USE/IGNORE INDEX .

    بعض الأمثلة:

    Mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; Mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id); mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; Mysql> SELECT * FROM table1 استخدم الفهرس (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; Mysql> SELECT * FROM table1 تجاهل الفهرس (key3) حيث key1=1 AND key2=2 AND key3=3;

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

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

    صلة داخلية

    يحدث أحد الطلبات الأكثر شيوعًا في كثير من الأحيان. سيُرجع هذا الاستعلام كافة السجلات من الجدول الأيسر (الجدول أ) والسجلات من (الجدول ب)، ولكنه سيُرجع الأعمدة المتطابقة فقط.

    طلب مثال:

    عرض الرمز SQL

    يختار< select_list>FROM Table_A A INNER JOIN Table_B B ON A. المفتاح = B. المفتاح

    الانضمام الأيسر

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

    طلب مثال:

    عرض الرمز SQL

    يختار< select_list>FROM Table_A A LEFT JOIN Table_B B ON A. Key = B. Key

    الانضمام الصحيح

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

    طلب مثال:

    عرض الرمز SQL

    يختار< select_list>FROM Table_A A RIGHT JOIN Table_B B ON A. المفتاح = B. المفتاح

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

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

    طلب مثال:

    عرض الرمز SQL

    يختار< select_list>FROM Table_A A FULL OUTER JOIN Table_B B ON A. Key = B. Key

    اليسار باستثناء JOIN

    سيعيد هذا الاستعلام جميع الأعمدة من الجدول الأيسر (الجدول أ) التي لا تتطابق مع الأعمدة من الجدول الأيمن (الجدول ب).

    طلب مثال:

    عرض الرمز SQL

    الآراء