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

ما هو الاتحاد في MySQL?
UNION هو MySQL عامل يجمع نتائج استعلامات SELECT المتعددة في مجموعة نتائج موحدة. تُوضع الصفوف المُعادة من الاستعلام الثاني أسفل الصفوف المُعادة من الاستعلام الأول، مما يُنتج قائمة عمودية واحدة بدلاً من قائمتين منفصلتين.
الشرط الوحيد لكي ينجح هذا هو أن يكون عدد الأعمدة هو نفسه في جميع استعلامات SELECT التي يجب دمجها.
لنفترض أن لدينا جدولين كما يلي.
يحتوي كلا الجدولين على عمودين من النوع نفسه، لذا فهما مؤهلان للدمج. الأمثلة التالية تجمع هذين الجدولين تحديدًا.
لماذا نستخدم الاتحاد؟
لنفترض أن هناك خللاً في تصميم قاعدة البيانات الخاصة بك، وأنك تستخدم جدولين مختلفين لنفس الغرض. تريد دمج هذين الجدولين في جدول واحد مع حذف أي سجلات مكررة من قاعدة البيانات.ping في الجدول الجديد. يمكنك استخدام UNION في مثل هذه الحالات.
يُعدّ هذا المشغل مفيدًا أيضًا في أعمال إعداد التقارير اليومية:
- Archiالبيانات الحية والمباشرة: يمكن إعداد تقارير عن جدول حالي وجدول أرشيف يشتركان في نفس الأعمدة معًا، دون دمجهما فعليًا.
- مصادر متعددة، تقرير واحد: يمكن إدراج الأعضاء والأفلام، أو المبيعات من منطقتين، في مخرج واحد لإجراء تدقيق سريع.
- عمليات التحقق من الهجرة: يمكن تكديس الصفوف من الجدول القديم والجدول الجديد ومقارنتها قبل حذف الجدول القديم.
لا يُعدّ الاتحاد بديلاً عن الربط. يضيف الاتحاد صفوفًا أسفل الصفوف، بينما يضيف الربط أعمدة بجانب الأعمدة، وهذا الاختلاف هو ما يحدد المعامل المطلوب للمهمة.
MySQL بناء جملة وقواعد الاتحاد
الآن وقد أصبح الهدف واضحاً، انظر إلى شكل البيان والقواعد التي تفرضها قاعدة البيانات.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
ثلاثة قواعد تحكم كل نقابة:
- عدد الأعمدة متساوٍ. كل اختيار البيان يجب أن تُرجع نفس عدد الأعمدة، وإلا MySQL يُظهر الخطأ 1222.
- أنواع البيانات المتوافقة بنفس الترتيب. تتم مطابقة العمود الأول من الاستعلام الأول مع العمود الأول من الاستعلام الثاني، لذا يجب أن يلتقي الرقم بالرقم والنص بالنص.
- الأسماء مستمدة من الاستعلام الأول. يتم أخذ عنوان مجموعة النتائج من أول استعلام 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 |




