Group by, having in SQL

الكاتب: Mr.Aziz

تاريخ النشر: 2021-07-12 18:04:28

مسااءكم الخير...

 

اليوم راح اشرح عن Group by وايضآ having (conditions) و ايش فرق بين where و having تمام.

 

  • Group by: يتم عمل ملخص و جمع البيانات الى تكون لها نفس القيمة بالجدول.

 

مثال: لو عندي جدول customer و جدول اخر cars هنا راح استخدم group by لجمع كل بيانات الى تكون لها نفس القيمة زي customer واحد يكون عنده 3 سيارات و customer ثاني يكون عنده 5 سيارات و تظهر لي الارقام بعد جمعها.

بدال مايكون كذا

customer cars
احمد سوناتا
أحمد كامري
خالد فراري
ماجد مازدا

قبل استخدام group by

راح يكون كذا لو تم جمع عدد الاشخاص الى يمتلك اكثر من سياره .

customer cars
احمد 2
خالد 1
ماجد 1

بعد استخدام group by

هنا ظهر لنا ملخص احمد يمتلك سيارتين بينما خالد وماجد سياره وحده فقط.

على كل حال group by لديه دالة لكي نستخدمها مثل COUNT, MAX, MIN, SUM, AVG

هذا Syntax تبع group by

select name
from tablename
group by name;

وراح اشرحها بالصوره مع امثلة بأذن الله ..

 


  • Count: يتم جمع او عد كل القيم متشابهه ولكن تختلف عن sum يعني اذا كان في شخص يتملك سيارتين بدال مايكون اسمه مكرر مرتين راح يكون رقم 2 زي مثال الى حطيته فوق.

هذا الجدول الى راح نستخدمه.

 

 

لما نجي نستخدم count في SQL راح نكتبها بهاطريقة:

select count (custID) as CarsNumber, NAME from customer natural join cars
group by NAME;

count (custID): يتم عد او جمع القيم متشابهه مثل الاشخاص الى لديهم سيارات.

as: هذا فقط نضع له أسم مختصر ولكن لن نستطيع نستخدمه في الشروط where بسبب هذا فقط اسم مستعار و مختصر.

name: اسم الاشخاص لكي يظهر لي كل اسم شخص مع عد الاشخاص يمتلكون اكثر من سياره.

مثال بالجدول عندنا Aziz لديه 3 سيارات سيظهر اسم Aziz ولكن count(custID) سيظهر عدد 3 اي Aziz لديه 3 سيارات :).

group by: نضع name مثل ماوضعنا داخل select

ملاحظة: اذا وضعنا اكثر من اسم مثل car, name, type يجب ان نضعها ايضآ داخل group by

وألا سوف يظهر لك خطأ.

مثال:

 

 

بعد ماستخدمنا group by ظهرت لنا فقط اسماء وعدد سيارات الى يمتلكها بكل شخص :).


  • SUM: يتم جمع كل ارقام المتواجده بالعمود في جدول. مثال

كم الارباح بعد جمع كل الاسعار الموجود بالجدول؟ نحتاج نعمل sum.

المهم راح نستخدم هذا الجدول:

 

 

النسبه الكود:

select sum(price) as money from cars;

هالمره مايحتاج نستخدم group by بسبب عدم وجود عمود اخر مثل name ,type

ولكن هالمره نستخدم فقط sum لكي يجمع لنا جميع الاسعار المتواجده بالجدول ونبي نعرف كم راح يكون كلها؟

هنا تجربة:

 

 

هنا نشوف النتيجة بعد ماعملنا Run طلع لنا المجموع جميع اسعار سيارات المتواجده بالجدول.

وهكذا يعمل sum :).


  • AVG: يتم اظهار المتوسط السعر او متوسط الارقام.

مثال لو نبي نعرض متوسط السعر بين السيارات راح نستخدم هذا الكود:

select avg(price) as money from cars;

avg(price): راح يظهر لنا المتوسط السعر و راح يكون كم بضبط.

بعد ماعملنا Run

هذا النتيجة:

 

 

ظهر لنا النتيجة 3303154 هذا المتوسط السعر.


  • MAX: يعطيك أكبر رقم من السعر او سعر الاكبر فيهم.

وايضآ يوجد دالة اخرى اسمها

  • Min: يعطي اصغر سعر بينهم.

نجرب مع MAX يعطينا اكبر سعر بينهم

select max(price)as LargestPrice from cars;

 

 

لما أستخدمنا MAX طلعنا نتيجة وحده الى هي اكبر رقم بين الاسعار.

ولكن خلينا نستخدم MIN بدال MAX.

 

 النتيجة 5000 لانها اصغر سعر بين الاسعار.


  • HAVING: شرط تابع group by فقط مثل where تابعه select

لما يكون عندنا قاعده بيانات كبيره و لما سوينا عد Count و نبي يعرض لنا فقط شي معين او اكبر من او اصغر من عن طريق COUNT.

مثلآ لو جينا نستخدم نفس المثال الى استخدمناه فوق تبع count

ولكن هالمره نضيف having

1
2
3
select count (custID) as CarsNumber, NAME from customer natural join cars
group by NAME
having count(custID) < 3;

having count(custID): مثل ماتلاحظون لازم نكتب having وبعدين نضع الدالة نفس الى وضعناها داخل select بضبط بحيث يعطينا الشرط الى نبيه من خلال group by

المهم الشرط ان تظهر لي النتيجة اقل من 3:

 

 

النتيجة ظهرت لنا العد و الشرط أن يكون اصغر من 3

 

هنا انتيهنا من الدرس group by و عرفنا ايش الفرق بين having و where مع الامثلة