1.  التجميع 

 

  1. GROUP BY

يتم إستخدام الكلمة GROUP BY لتقسيم نتيجة بحث  الى مجموعات و من تم إستخراج نتائج تجميعية كالمجموع SUM و المعدل AVG و القيمة الأصغر MIN و القيمة الأكبر MAX و غيرها. بصفة عامة تستخدم على الشكل التالي :

SELECT col1, fonction(col2)
FROM table
GROUP BY col1

لنأخذ مثال جدول مبيعات كالتالي : 

id customer price date
1 سعيد 22 2014-10-23
2 سعيد 53 2014-11-23
3 نادين 112 2014-10-23
4 فاروق 22 2014-10-23
5 سعيد 104 2014-10-23

 

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

SELECT customer, SUM(price)
FROM sales
GROUP BY customer

النتيجة هي تجميع المشتريات الثلاثة للزبون "سعيد" :

customer SUM(price)
سعيد 179
نادين 112
فاروق 22

 

  1. استخدام الدالات الإحصائية

  • ()SUM : كما رئينا في المثال المدرج في المثال التمهيدي، تمكن من إعطاء المجموع.
  • ()AVG : حاولوا في المثال أعلاه بتعويض SUM ب AVG، النتيجة هي معدل ثمن المشتريات لكل زبون. بالنسبة لسعيد ستكون النتيجة هي 179/3
  • ()MIN : بنفس الطريقة، سنحصل على أقل ثمن لمشتريات كل زبون مثلا 22 بالنسبة لسعيد.
  • ()MAX : عكس MIN، بالنسبة لسعيد ستكون النتيجة هي : 104
  • ()COUNT : لحساب عدد من الصفوف. يتيح معرفة عدد عمليات الشراء أدلى بها كل زبون، 3 بالنسبة لسعيد. هذه الدالة بالذات كثيرة الإستعمال، عادة ما نكتب للتمكن ممن حساب عدد السطور في جدول ما :
SELECT COUNT(*) FROM table;

 

  1. كلمة HAVING

 

تشبه HAVING الى حد ما WHERE، مع بطبيعة الحال فارق كون HAVING تستعمل في إطار عملية تجميع GROUP BY لتصفية جزء من النتائج. و يتم إستعمالها بالطريقة التالية : 

SELECT col1, SUM(col2)
FROM my_table
GROUP BY col1
HAVING fonction(col2) operator value

مثلا، إن أردنا حساب مجموع المشتريات التي لكل زبون إشترى مجموعا يفوق ثمنه 30 سيكون الإستعلام كالتالي :

SELECT customer, SUM(price)
FROM sales
GROUP BY customer
HAVING SUM(price)>=30;
customer SUM(price)
سعيد 179
نادين 112

 

  1. العمليات على المجموعات

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

 

  1. UNION

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

هكذا نكتب ببساطة :

SELECT * FROM table1
UNION
SELECT * FROM table2

لكن هذه الكتابة تفترض أن أعمدة الجدول 1 و الجدول 2 متساوية من حيث العدد و صنف البيان و الترتيب. إذا أخذنا جدولين غير متجانسين لكنهما يشتركان في عمود من صنف INT و آخر من صنف VARCHAR فإننا نستطيع كتابة :

SELECT col_int1 AS 'numero' , col_char1 AS 'titre'  FROM table1
UNION
SELECT col_int2 AS 'numero' , col_char2 AS 'titre' FROM table2

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

 

  1. INTERSECT

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

تمكن INTERSECT من إستخراج السطور حيث يتقاطع جدولين أو أكثر. و تكتب بهذا الشكل :

SELECT * FROM table1
INTERSECT
SELECT * FROM table2

 

  1. EXCEPT/MINUS

هنا يتعلق الأمر بمفهوم الناقص في المجموعات، مثلا الإستعلام التالي سيرد أسطر الجدول 1 غير الموجودة في الجدول 2 :

SELECT * FROM table1
MINUS
SELECT * FROM table2

يستعمل EXCEPT في القواعد من نوع PostgreSQL و SQLServer. فيما يستعمل MINUS في Oracle و MySQL.