MySQL الاتحاد – البرنامج التعليمي الكامل

⚡ ملخص ذكي

MySQL تجمع عملية UNION نتائج استعلامين أو أكثر من استعلامات SELECT في مجموعة نتائج موحدة. يشرح هذا الدليل قواعد الأعمدة التي تجعل عملية UNION صالحة، والفرق بين UNION DISTINCT و UNION ALL، بالإضافة إلى أمثلة عملية تم تطبيقها على قاعدة بيانات myflixdb.

  • 🔗 الغرض الأساسي: تقوم عملية UNION بتجميع الصفوف التي تم إرجاعها بواسطة عدة استعلامات SELECT في مجموعة نتائج واحدة، حيث يكون كل استعلام أسفل الآخر.
  • 📐 قاعدة العمود: يجب أن تُرجع كل عملية SELECT نفس عدد الأعمدة، بنفس الترتيب، وبأنواع بيانات متوافقة.
  • 🧹 الاتحاد المتميز: يتم حذف الصفوف المكررة ويتم إرجاع الصفوف الفريدة فقط، وهذا هو السلوك MySQL يتم تطبيق ذلك افتراضياً.
  • 📚 الاتحاد للجميع: يتم إرجاع كل صف، بما في ذلك التكرارات، وهو أمر أسرع لأنه لا يلزم إجراء عملية إزالة التكرارات.
  • 🏷️ أسماء الأعمدة: تستمد مجموعة النتائج أسماء أعمدتها من عبارة SELECT الأولى، لذا فإن الأسماء المستعارة تنتمي إلى هذا الاستعلام.
  • 🛠️ الاستخدام النموذجي: دمج جدولين يحتويان على نفس نوع السجل، دون السماح بوجود صفوف مكررة في الناتج المدمج.

MySQL UNION Operaتور

ما هو الاتحاد في MySQL?

UNION هو MySQL عامل يجمع نتائج استعلامات SELECT المتعددة في مجموعة نتائج موحدة. تُوضع الصفوف المُعادة من الاستعلام الثاني أسفل الصفوف المُعادة من الاستعلام الأول، مما يُنتج قائمة عمودية واحدة بدلاً من قائمتين منفصلتين.

الشرط الوحيد لكي ينجح هذا هو أن يكون عدد الأعمدة هو نفسه في جميع استعلامات SELECT التي يجب دمجها.

لنفترض أن لدينا جدولين كما يلي.

MySQL UNIONMySQL UNION

يحتوي كلا الجدولين على عمودين من النوع نفسه، لذا فهما مؤهلان للدمج. الأمثلة التالية تجمع هذين الجدولين تحديدًا.

لماذا نستخدم الاتحاد؟

لنفترض أن هناك خللاً في تصميم قاعدة البيانات الخاصة بك، وأنك تستخدم جدولين مختلفين لنفس الغرض. تريد دمج هذين الجدولين في جدول واحد مع حذف أي سجلات مكررة من قاعدة البيانات.ping في الجدول الجديد. يمكنك استخدام UNION في مثل هذه الحالات.

يُعدّ هذا المشغل مفيدًا أيضًا في أعمال إعداد التقارير اليومية:

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

لا يُعدّ الاتحاد بديلاً عن الربط. يضيف الاتحاد صفوفًا أسفل الصفوف، بينما يضيف الربط أعمدة بجانب الأعمدة، وهذا الاختلاف هو ما يحدد المعامل المطلوب للمهمة.

MySQL بناء جملة وقواعد الاتحاد

الآن وقد أصبح الهدف واضحاً، انظر إلى شكل البيان والقواعد التي تفرضها قاعدة البيانات.

SELECT column1, column2 FROM `table1`
UNION [DISTINCT | ALL]
SELECT column1, column2 FROM `table2`;

ثلاثة قواعد تحكم كل نقابة:

  1. عدد الأعمدة متساوٍ. كل اختيار البيان يجب أن تُرجع نفس عدد الأعمدة، وإلا MySQL يُظهر الخطأ 1222.
  2. أنواع البيانات المتوافقة بنفس الترتيب. تتم مطابقة العمود الأول من الاستعلام الأول مع العمود الأول من الاستعلام الثاني، لذا يجب أن يلتقي الرقم بالرقم والنص بالنص.
  3. الأسماء مستمدة من الاستعلام الأول. يتم أخذ عنوان مجموعة النتائج من أول استعلام SELECT، ولهذا السبب ينتمي أي اسم مستعار إلى هناك.

An ORDER BY أو LIMIT ينطبق الشرط الموضوع في النهاية على النتيجة المجمعة بدلاً من فرع واحد منها، ويجب أن يشير إلى أسماء الأعمدة التي تم إنتاجها بواسطة SELECT الأول.

الاتحاد المتميز ضد الاتحاد الكل

بعد وضع القواعد، يبقى القرار المتبقي هو ما إذا كان ينبغي الاحتفاظ بالصفوف المكررة أم لا.

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

لنقم الآن بإنشاء استعلام UNION لدمج كلا الجدولين باستخدام DISTINCT.

SELECT column1, column2 FROM `table1`
UNION DISTINCT
SELECT column1, column2 FROM `table2`;

هنا تتم إزالة الصفوف المكررة ويتم إرجاع الصفوف الفريدة فقط.

الاتحاد-متميز

ملاحظة: MySQL يستخدم جملة DISTINCT كإعداد افتراضي عند تنفيذ استعلامات UNION إذا لم يتم تحديد أي شيء.

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

لنقم الآن بإنشاء استعلام UNION لدمج كلا الجدولين باستخدام ALL.

SELECT `column1`, `column2` FROM `table1`
UNION ALL
SELECT `column1`, `column2` FROM `table2`;

تم تضمين الصفوف المكررة هنا، لأننا نستخدم الكل.

الاتحاد للجميع

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

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

💡 نصيحة: إذا لم يتمكن الفرعان من إنتاج صفوف مكررة، فاختر UNION ALL. عندها تتجاوز قاعدة البيانات عمليات الفرز والمقارنة التي يتطلبها DISTINCT، مما يوفر وقتاً ملحوظاً في الجداول الكبيرة.

مثال عملي باستخدام MySQL طاولة العمل

استخدمت الأمثلة السابقة جداول نموذجية. أما الآن، فيتم تشغيل نفس الاستعلام على قاعدة بيانات myflixdb الحقيقية، حيث يحتوي الجدولان على سجلات مختلفة تمامًا.

في قاعدة بيانات myFlixDB الخاصة بنا، دعونا نجمع membership_number و full_names أعمدة من جدول الأعضاء مع movie_id و title الأعمدة من جدول الأفلام. كلا الاستعلامين يُرجعان عمودين، لذا فإن عملية الاتحاد صحيحة.

يمكننا استخدام الاستعلام التالي.

SELECT `membership_number`, `full_names` FROM `members`
UNION
SELECT `movie_id`, `title` FROM `movies`;

تنفيذ البرنامج النصي أعلاه في MySQL طاولة العمل يُظهر لنا الاستعلام المُقارن مع قاعدة بيانات myflixdb النتائج التالية الموضحة أدناه. لاحظ أن العناوين تأتي من استعلام SELECT الأول، على الرغم من أن الصفوف السفلية تمثل سجلات الأفلام.

membership_number full_names
1 Janet Jones
2 Janet Smith Jones
3 Robert Phil
4 Gloria Williams
5 Leonard Hofstadter
6 Sheldon Cooper
7 Rajesh Koothrappali
8 Leslie Winkle
9 Howard Wolowitz
16 67% Guilty
6 Angels and Demons
4 Code Name Black
5 Daddy's Little Girls
7 Davinci Code
2 Forgetting Sarah Marshal
9 Honey mooners
19 movie 3
1 Pirates of the Caribean 4
18 sample movie
17 The Great Dictator
3 X-Men

الأسئلة الشائعة

تقوم عملية الاتحاد (UNION) بتجميع صفوف استعلام واحد تحت صفوف استعلام آخر، مما يجعل النتيجة أطول. الانضمام تُطابق هذه العملية الصفوف ذات الصلة وتضع أعمدتها جنبًا إلى جنب، مما يؤدي إلى زيادة عرض النتيجة. استخدم UNION للصفوف المتشابهة، وJOIN للجداول ذات الصلة.

ضع واحداً ترتيب حسب عبارة LIMIT التي تُوضع بعد آخر استعلام SELECT. تقوم هذه العبارة بفرز النتائج المجمعة، ويجب أن تستخدم أسماء الأعمدة التي تم الحصول عليها من استعلام SELECT الأول. وتعمل عبارة LIMIT بنفس الطريقة.

يظهر الخطأ 1222 عندما تُرجع فروع استعلام SELECT عدد أعمدة غير متساوٍ. قم بحساب عدد الأعمدة في كل فرع، وأضف قيمة حرفية أو قيمة فارغة (NULL) إلى الفرع الأقصر بحيث يتطابق ترتيب الأعمدة في كلا الفرعين.

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

يمكن للمساعد اقتراح استخدام UNION ALL عندما يكون من المستحيل إزالة البيانات المكررة، وهو ما يُعدّ وسيلة شائعة لتحسين السرعة. مع ذلك، يبقى القرار معتمدًا على البيانات، لذا تأكد من عدم وجود تداخل بين الفروع قبل حذف خطوة إزالة البيانات المكررة.

تلخيص هذه التدوينة بـ: