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 مع الامثلة