كيفية استخدام عمليات الدمج Union في لغة SQL
يا هلا! اليوم بنتكلم عن واحدة من أقوى أدوات دمج البيانات في SQL: عمليات UNION. ببساطة، UNION تسمح لك بدمج نتائج استعلامين أو أكثر في مجموعة نتائج واحدة. تخيل عندك بيانات في جدولين مختلفين وتبغى تشوفها كلها سوا، هنا يجي دور UNION.
القواعد الأساسية اللي لازم تعرفها
عشان UNION تشتغل صح، فيه كم شرط لازم تتحقق:
- عدد الأعمدة: لازم يكون عدد الأعمدة في كل استعلام متساوي بالضبط.
- أنواع البيانات: لازم تكون أنواع البيانات للأعمدة المتناظرة متوافقة (يعني لو العمود الأول في الاستعلام الأول
INT، لازم يكون العمود الأول في الاستعلام الثانيINTأو نوع بيانات ممكن يتحول له بسهولة). - ترتيب الأعمدة: يفضل يكون ترتيب الأعمدة متطابق عشان النتائج تكون منطقية، لكن حتى لو الأسماء مختلفة، طالما الترتيب وأنواع البيانات متوافقة، بتشتغل.
UNION vs UNION ALL
هنا نقطة مهمة جداً:
UNION: تقوم بدمج النتائج وتزيل الصفوف المكررة. يعني لو فيه صف موجود في كلا الاستعلامين، بيظهر مرة واحدة بس في النتيجة النهائية.UNION ALL: تقوم بدمج النتائج وتحتفظ بجميع الصفوف، حتى لو كانت مكررة. يعني لو فيه صف موجود في كلا الاستعلامين، بيظهر مرتين (أو أكثر حسب تكراره).
ملاحظة سريعة:
UNIONعادةً تكون أبطأ منUNION ALLلأنها تحتاج تبذل جهد إضافي عشان تبحث عن الصفوف المكررة وتحذفها. لو أنت متأكد إن ما فيه تكرار أو ما يهمك التكرار، استخدمUNION ALLعشان أداء أفضل.
مثال عملي: دمج بيانات الموظفين
تخيل عندنا جدولين: Employees_IT و Employees_HR. نبغى نشوف قائمة بأسماء كل الموظفين من القسمين.
جدول Employees_IT:
CREATE TABLE Employees_IT ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), Department VARCHAR(50) ); INSERT INTO Employees_IT (EmployeeID, FirstName, LastName, Department) VALUES (1, 'أحمد', 'علي', 'IT'), (2, 'فاطمة', 'محمد', 'IT'), (3, 'خالد', 'سعيد', 'IT');
جدول Employees_HR:
CREATE TABLE Employees_HR ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), Department VARCHAR(50) ); INSERT INTO Employees_HR (EmployeeID, FirstName, LastName, Department) VALUES (4, 'نورة', 'ناصر', 'HR'), (5, 'سارة', 'فهد', 'HR'), (2, 'فاطمة', 'محمد', 'IT'); -- هذا الصف مكرر قصداً عشان نشوف الفرق
استخدام UNION (لإزالة التكرار)
إذا استخدمنا UNION، الصف المكرر (فاطمة محمد) بيظهر مرة واحدة:
SELECT FirstName, LastName, Department FROM Employees_IT UNION SELECT FirstName, LastName, Department FROM Employees_HR;
النتيجة المتوقعة:
FirstName | LastName | Department ----------|----------|----------- أحمد | علي | IT فاطمة | محمد | IT خالد | سعيد | IT نورة | ناصر | HR سارة | فهد | HR
استخدام UNION ALL (للاحتفاظ بالتكرار)
إذا استخدمنا UNION ALL، الصف المكرر (فاطمة محمد) بيظهر مرتين:
SELECT FirstName, LastName, Department FROM Employees_IT UNION ALL SELECT FirstName, LastName, Department FROM Employees_HR;
النتيجة المتوقعة:
FirstName | LastName | Department ----------|----------|----------- أحمد | علي | IT فاطمة | محمد | IT خالد | سعيد | IT نورة | ناصر | HR سارة | فهد | HR فاطمة | محمد | IT -- هذا الصف مكرر
UNION مع أسماء أعمدة مختلفة
أحياناً تكون عندك أعمدة نفس النوع والترتيب لكن أسماؤها مختلفة. تقدر تستخدم ALIAS عشان تخلي النتيجة أوضح. الأهم هو ترتيب وأنواع البيانات للأعمدة، مش أسماؤها.
SELECT FirstName AS EmployeeName, Department FROM Employees_IT UNION SELECT LastName AS EmployeeName, Department FROM Employees_HR; -- هنا دمجنا الاسم الأول من الأول مع الاسم الأخير من الثاني
هنا النتيجة بتدمج الأسماء الأولى من Employees_IT مع الأسماء الأخيرة من Employees_HR، وتسمي العمود الناتج EmployeeName. طبعاً هذا مثال للتوضيح، وفي الواقع لازم تكون متأكد إن الدمج له معنى.
الترتيب مع UNION (ORDER BY)
إذا تبغى ترتب النتائج النهائية لعملية UNION، لازم تحط جملة ORDER BY في نهاية الاستعلام الأخير بس.
SELECT FirstName, LastName, Department FROM Employees_IT UNION ALL SELECT FirstName, LastName, Department FROM Employees_HR ORDER BY FirstName ASC, Department DESC;
لاحظ إن ORDER BY تنطبق على مجموعة النتائج المدمجة كاملة.
خلاصة
عمليات UNION و UNION ALL أدوات قوية جداً لدمج البيانات من مصادر مختلفة. تذكر دائماً القواعد الأساسية (عدد الأعمدة وأنواع البيانات) واختار بين UNION و UNION ALL بناءً على حاجتك لإزالة التكرار وأداء الاستعلام. استغلها صح وبتوفر عليك وقت وجهد كبير في تجميع التقارير والبيانات.
وبس! أتمنى يكون الشرح واضح ومفيد.