بسم الله الرحمن الرحيم اليوم بنكمل في chapter 5
نتكلم عن ال group by و ال having شرحنا المرة
الماضية أن ال aggregate functions هي functions
بنستخدمها على مجموعة من ال rows تعطينا معلومات
عامة minimum و maximum sum مجموع average معدل
count عدد وفي منها versions مع استخدام distinct
بدون تكرار أن أطلع عدد الأسطر اللي فيها
معلومات معينة بدون تكرار أطلع ال average لمثلًا
علامات الطلاب بدون تكرار علاماتهم كلمنا بعدها عن
ال group by حكينا بإستفيد منها أن نعمل grouping
مجموعات للبيانات اللي بده أعرضها يعني ممكن أنا
أعرض علامات الطلاب و أجمعهم حسب القسم group by
department name نفس الشيء الموظفين ممكن أستعرض ال
salary تاعت الموظفين ال average تبعها أو ال sum
المجموعة تبعها و أقسمهم حسب أقسامهم في الشغل أو في
المؤسسة أو في الشركة group by department name أو
department number أخدنا أمثلة على ال sailors اللي
عندنا كيف عملنا لهم grouping حسب ال rating فينا
تقييم لل sailors البحارة عملنا لهم groups كل
مجموعة حسب ال rating اللي ال rating تبعهم عشرة
لحال التمانية لحال السبعة لحال في كل group من هدول
ممكن نفذ aggregate functions انه نعمل average نعمل
sum نعمل count اتكلم عن ال having فديتها نحط شرط
شبه شرط ال where لكن بطبقه على مين؟ على ال group اني
اخد ال group كلها أو ما أخدهاش شرط على مستوى ال
group النقطة الأخيرة اللي اتكلمنا عنها انه أي
column بده يظهر في ال select في ال target list
لازم يكون يا اما عبارة عن aggregate function أو
column مذكور اسمه أين في ال group by فيها
عندي مثال أن أنا بدي أعمل select لل department name
أختار اسم القسم و أعرض معه ال average لل salary
معدل أو متوسط للراتب من جدول مثلًا الموظفين أو ال
instructors المدرسين في الجامعة ال group by ال
department name ال department name أنا قدرت أحطه
في ال select لأنه موجود أصلاً وين في ال group by
لكن مثلًا اسم ال employee لو بدأت أعمل مع هذه
department name مع ال salary بدأت أحكي مثلًا ال
employee name هتعطيني error ليش؟ لأن ال employee
name مش موجود في ال group by و أنا مستخدم
aggregate function ليش هيعطيني غلط من ناحية logic؟
ليش هيعطيني غلط؟ لأن ال average salary هذا معدل
الرواتب اسم مين هيعطيني؟ اسم أحمد ولا محمود ولا
علش؟ هذه معلومة عامة عن القسم فأنا منطقي أن أحط
اسم القسم و ال average تبع الرواتب بس اسم الموظف
ما في موظف بيستلم هذا الراتب ال average salary ما في
حد إله هذا الراتب مش موجود في الجدول هذا رقم احنا
حسبناه احنا عملناه
هناخد مجموعة من الأمثلة على ال sailors و ال boats
و ال reserves اللي عندنا في عندي أول query مطلوب
فيها أن find ال age لنوجد العمر لل youngest
sailor youngest يعني أصغر واحد في العمر يعني إذا
إيش بدي أستخدم؟ أي function؟ ال average؟ ال min
بدي أستخدم ال min عشان ال minimum youngest sailor
with age أكبر من أو بساوي 18 برضه في عندي شرط يعني
أي sailor عمره أقل من 18 بده يدخل في الحسابات
بتاعتنا لأ ما بده يدخل for each rating كلمة for
each rating معناته أنا بدي أجمع ال sailors حسب ال
rating يعني أنا مش بدي بس أطلع أصغر واحد في العمر
لأ أصغر واحد لكل rating أعملهم groups و أطلع أصغر
واحد في كل group في عندي كمان شرط at least two such
sailors في نفس age لجروب يعني لو لجروب فيها sailor
واحد بدناش لجروب كلها يعني الشرط هذا على مستوى مين؟
على مستوى لجروب في أي جملة بدأ اكتبه؟ في ال having
حتطلع عندي شكل كوير بهذا الشكل select ال rating ال
minimum لل age مش احنا بدنا ال youngest sailor
minimum age as min age from sailor where ال S أكبر
من أو بيساوي 18 هذا أي شرط الشرط اللي فوق أن احنا
بدناش ال sailors اللي أصغر من 18 الجدول اللي عندنا
فيه حد أصغر من 18 طلع عليه في واحد كام عمره عمره
16 هذا مش هيدخل إيش مش هيدخل في حسبتنا إيش اسمه
زوربة و كام ال rating تبعه عشرة هذا هنحدثه لإنه
بتبقش ال qualification أو الشرط اللي عندي في ال
where هعمل بعدها group by ال rating بدي أوزع ال
sellers اللي عندي حسب ال rating لو جيبنا ال tables
هاي ال tables اللي عندي هذا زوربة عمره ستاشر هدف
ال ware ماله هيروح لأنا بدي أعمل grouping حسب ال
rate السبعة في كمان سبعة زيها هاي group صح الواحد
هي group لحاله تمانية هي group العشرة فش لأن
العشرة الثانية أخدناها فهي لحالها لوحدها السبعة
أخدناها التسعة group لحالها فش حد زيها التلاتة
اتنين إذا نهي عملنا ل groups عملنا ل groups ده
طلع الشرط تبع ال group having ال count أكبر من واحد
ال count تبع ال group ال count هذا شرط لل group ال
count تبع ال group أكبر من واحد هاي هارجع الجدول
السبعة كم واحد فيها؟ اثنين يعني ال count تبعها
اثنين أكبر من واحد إذا هناخد السبعة الواحد تمانية
العشرة لإنه ضال الواحد شيلنا هذا في ال where هذا
راح التسعة برضه لأ التلاتة إذا النتيجة اللي عند مين
اللي هيطلع تلاتة ال rating تلاتة ال group بتاعة
التلاتة ال group بتاعة السبعة و ال group بتاعة
التمانية three groups بس اللي هيطلعوا تلاتة و سبعة
و تمانية في كل واحدة إيش بدنا نحسب احنا كلنا أصغر
واحد ال minimum age هاي ال query اللي كانت هنا ال
rating هين طلعنا ال rating تلاتة و سبعة و تمانية
عملنا ال rating اللي كانت في ال group قسمناهم
groups و شيلنا ل groups اللي مالها اللي مش أكبر من
واحد العدد فيها لأن بعد ال rating بيطلع ال minimum
age لكل rate هرجع الجدول السابعة خمسة و أربعين و
كام خمسة و تلاتين السابعة هتطلع عندي خمسة و تلاتين
التلاتة خمسة و عشرين و نصال minimum age ال تمانية
خمسة و عشرين و نصف تحبون نتأكد من الكلام هذا على
ال Oracle هنحيب
ال query كلها ناخذها
على ال Oracle و نجرب
إيش المشكلة؟ مين يحكي لي إيش المشكلة؟ قل ولا قل
يعني؟ بيبين عندكم ولا لأ؟
هي خليني أرفع الصوت شوي
إيش المشكلة ال query اللي طلعوا على ال query اللي أعطانا
هي مش معمولة underscore بالضبط مش معمولة
underscore هو بتطلع اللي بيفكرها minus يعني إذا
كانوا في two columns واحد اسمه من ده عمل minus
ال age مش مظبوط الكلام هذا بدرجة عشان أريح علي بدل
ما أظبط ال query كلها أحول هذه ال underscore أخذها
كلها المرة الواحدة I base
إيش أعطانا؟ نفس النتيجة اللي احنا عملناهم ولا لأ؟
تمانية و سبعة و تلاتة، خمسة و عشرين و نص، خمسة و
تلاتين، خمسة و عشرين و نص طيب لو شيلنا ال having
إيش هتكون النتيجة؟ مين اللي شطبناهم احنا بسبب ال
having؟ العشرة و التسعة و الواحد و الواحد صح؟ هدول
كلهم حذفناهم هاي بدنا نشيل ال having هاي هنشيل ال
having هنجرب نفس ال query
أعطاني كل المجموعات حتى اللي ما فيش فيها غير ... بس
واحد إذا ال having شرط على ال group شرط على ال
group طب لو شيلنا ال where ال sh أكبر من .. أو
بتساوي ثمان عشر و خلينا ال having إيش التغيير اللي
هيسير؟ طلع
إيش بدي أشيل؟ بدي أشيل بس ال where و مش
هننفذ الأمر عبال ما تفكروا أنتم و تحكولي إيش
النتيجة هتكون بس ال where بدي أخلي ال having و بدي
أشيل بس ال where بس
العشرة اللي هتزيد يعني التلاتة و السبعة و التمانية و
العشرة لأن العشرة احنا شيلناها لأن كنا شاطبين
العشرة اللي عمره ستاشر الآن هيظهر لأن مش هيروح في
ال where statement هكمل هاي ال query بدون ال where
أعطاني زي ما حكينا العشرة اجت معهم و أعطاني أن
العشرة ال minimum فيها 16 هي كودحة فكرة إيش الفرق
بين ال where و ال having ال where شرط عام على كل
الجدول رو رو بحسبه على كل رو ال having شرط على ال
group ك group طيب بما أن ال having شرط على ال
group معناته مش لازم يطلع عندي شرط في ال having
إلا يكون موجود في ال group by أو يكون aggregate
function زي ما عملنا مع ال select مش ال select لما
يكون في aggregate function حكينا إذا بدي أحط جنبها
column لازم يكون موجود في ال group by ال having
بنفعش أحط شرط اللي هيكون ماله موجود في ال group by
اسم ال column موجود في ال group by أو هو عبارة عن
aggregate function ال evaluation هيشرحها أنا
المرة اللي فاتت أنه كيف نعمل evaluation نفس ال
evaluation بتاع ال select العادية بس هنضيف عليها
في الآخر خطوتين نعمل partitioning حسب ال group أعمل
ال groups وبعدين أشطب ال groups حسب ال هذا وهيك
بيطلع عندي النتيجة هي في عندي جدول شبيه في الجدول
اللي عندنا لل sailors بس لاحظوا في سطر زيادة مش
موجودة عندنا واحد اسمه Frodo رقمه 96 من ال group
اللي ال rating تبعها 3 وعمره 25.5 نضيفه على
الجدول ونفذتقريبا نفس ال query اللي كنا عاملينها
نفسها ايش هيختلف؟ احنا
في الأولى .. احنا في الأولى كان طالع معنا التلاتة
والسبعة والتمانية صح؟
نفس الاشي؟ هتطلع هي النتيجة اللي كانت عندي التلاتة
والسبعة والتمانية والعشرة التلاتة أصلا موجودةبس
كام كان عمره أقل واحد خمسة وعشرين ونصف لان افراده
اللي ضفناه كام عمره نفس الاشي يعني النتيجة هتتغير
مش هتتغير لان نفس العمر طب لو كان عمره أقل هيعطينا
عمره أقل لو كان أكبر مش هيتغيرش مش هيتغيرش طب لو
كانت بدل من كنا عاملين average دعونا نجرب نعمل
average وبعدين نضيف فروده ونشوف إيش أثره على ال
average هجيب
نفس ال query بس بدل ال min هنعمل average
هذه هنحطها وننفذها أعطاني التمانية والسبعة
والتلاتة وإيش الأرقام اللي أعطانيهم اربعين ونص
اربعين اربع واربعين ونص هدول average ده الأعمار
لكل group فعليا احنا كل group عندنا فيها كام واحد
اتنين بس لإن الجدول اللي عندنا صغير الان اللي انا
بدي أعمله اني بدي أضيف Frodo هذا عشان يكون ال
group بتاعة التلاتة zero count تلت أشخاص بدل ما هم
شخصين كيف نضيفه insert into يالا زي ال quiz into
sailors values مش بضرر أحط أسماء ال columns يعني
هعبي كل ال columns نفس الترتيب أول شي ال SID كام
رقمه 96 96 فرودو تلاتة خمسة و عشرين و نص احفظوا
الأرقام 96
فرودو أنا بالنسبالي في الجدول معبّي كل الأسماء أول
حرف كبط اللطر فعملت أول حرف كبط اللطر فرودو كام
كان ال group بتاعته تلاتة ال rating تبعها تلاتة
عمره خمسة و عشرين و نص هياخده ولا لأ طيب كيف بدي
أعرف كام عدد ال sailors صار كام عددهم عندكم عشر
عشر لأن كام لازم يسيروا كيف بدي أعرف إن عددهم إحدى
عشر يلا احكولي إيش أكتب مش عارف أنا ناسي select
count ايش count star بعدين
بلزم
اشي تاني كام العدد يعني شغلنا صح طيب الان هنجيب
نفس ال query
ونشوف أثر اللي هو fraud و اللي ضفناها المفروض أثر
يكون في أي group اللي ال rating تبعهم تلاتة بس
الباقين المفروض ماتغيروش حط
هاي based وهاي ال command ال group التلاتة كام
صار ال average تبع العمر 38 وكسر سابقا كام كانت
كانت 44.5 صح؟ نزلت لتحت صارت تمانية و تلاتين ليش
عمره كبير ولا صغير اللي ضيف ناس عمره
صغير مقارنة بالتانين عمره خمسة و عشرين من نص
التانين واحد عمره تلاتة و ستين أكبر منه تلاتة و
ستين و تانه خمسة و عشرين فقيمته أصغر بكتير من عمره
تلاتة و ستين فعمل في ال average نزل ال average
العملية بتتم بالشكل هذا بس احنا شرحناها كاملة انه
هي عندي الجدول بنعمل grouping على ال rating هي
groups زي ما احنا اشتغلنا groups ومن كل group
أخدنا ال minimum لإن احنا كان في السؤال المطلوب ال
youngest أصغر واحد لو ال average هاخد ال average
للأعمار هدول average لهدول لحد لو انا بدي ال
average لو بدي ال count هعطيني العدد تبعهم انه هي
ال group لو ال count هي كام كم هاي ال group لو بدي
ال count تلاتة هاي اتنين اتنين واحد واحد واحد نفس
المثال بس ضفنا عليه شرط جديد شوية تعقيد جديد انه
مطلوب find ال age of the youngest sailor with age
أكبر من أو بسوء 18 يعني ال where statement موجودة و
ال rating لازم يكون على الأقل two sailors يعني ايش
يعني على الأقل two sailors يعني أكبر من .. أكبر من
واحد بس كمان طالبين أن ال sailors يكونوا عمرهم بين
ال 18 وال .. و ال 60 طب الشرط هذا الجديد اللي بين
ال 18 وال 60 مين اللي بدنا نضيفه عشان يعطينا
نتيجة صح هنضيفه في ال where هنحطه في ال where طب
ممكن نحطه في ال having؟ مين حكى اه؟ كيف؟
طيب تبقوا عليا ال where هتفحص سطر سطر ف رو رو فانا
ممكن افحص العمر ان هو اكبر من او بيساوي 18 اقل من
او بيساوي 60 لكن ال having بتفحص عليه group مش ع
واحد فانا ممكن افحص ال having ع ال average تبع
العمر ال count تبع ال group ال minimum الماكسما
ممكن افحص عليه لكن مش ممكن افحص ان عمر كل سيلر في
ال group اقل من ستين مش ممكن افحصها في ال having
لأن ال having مش راح تيجي على ال row نفسه راح تيجي
على ال group ككله حكي انا لازم يكون الاشي اللي بدأ
افحص عليه موجود في ال group by أو aggregate
function هل العمر موجود في ال group انا عامل group
by على العمر؟ لأ عامل على ال rate فمش ممكن الشرط
هذا لازم يكون وين؟ في ال where statement هننفذ نفس
الشيء ال 18 هتشيل عند ال اسمه زوربة اللي عمره عشرة
اللي
عمره 16 ال rating تبقى عشرة زوربة و اللي عمره 63
هيروح بوبها من أي group؟ تلاتة هيضل من عند ال
groups اللي هتضل؟ الجروب التلاتة والسبعة والتمانية
ليش التلاتة ضالت؟ لإن احنا ضيفنا كمان واحد كمان
Frodo طب لو ماكناش ضايفينه و حذفنا ال .. ال .. ال
bob مش هتطلع لإن ال count هيصير أكبر مش أكبر من
واحد مش أكبر من واحد واضحة ولا نجرب و نعمل ..
عندي كمان query زي هيك بدنا for each red boat find
the number of reservations for this boat بدي أشوف
القارب اللون أحمر وأطلع عدد الحجزات اللي انحجز
هذا القارب طيب نرجع لفكرة مهمة ال red اللون
primary key يعني ممكن يكون في أكتر من القارب لونهم
أحمر تمام؟ طيب لو كل قارب مثلا القارب الأول انحجز
مرتين والتاني تلاتة ال count كام هيطلع؟ خمسة لأن
أنا بدورش على قارب بعينه أنا بدور على أي قارب لونه
أحمر يعني هذا مش primary key ممكن يكون أكتر من
قارب أحمر وفعلا عندنا احنا الجدول لو تطلعنا على
ال .. ال boots اللي عندنا كام قارب لونه أحمر؟ مية
واتنين ومية وأربعة قاربين تمام؟ الان انا بطلع ال
count تبعهم عددهم ال number بس وين؟ في ال
reservation عدد الحجوزات شكل ال select بيكون
بالشكل هذا دعم ال انا select انا بهمني العدد
سيبوكم من ال BID لان نشرح عن ال BID انا بدي العدد
ال count from ال boats وال sailors where رقم ال
boat هذا هو نفسه اللي في ال reservation نفسه في ال
boats بدي أربط بين الجدولين ال primary key مع ال
foreign مع ال foreign key and ال color يكون red و
أعمل ال group by .. by مين ال BID ليش عملت group
by حسب ال BID عشان أحط ال BID وين عشان أحطها في ال
select لو بدي شيها في ال select مش محتاجة مش
محتاجها تكون موجودة تحت وهذا هيطلع لي ال count
لأن بمناع ال multigroup by حسب ال BID لو عندي
قاربين زي المثال اللي عندي قاربينهم أحمر هيحسبلي
ال count اللي لهم الأثنين مع بعض يعني الأول محجوز
ثلاث مرات والتاني محجوز مرتين هيعطيني خمسة ولا
هيعطيني على الأول تلاتة وعلى التاني اتنين على كل
واحد لحال ليش في group by حسب ال BYD لو لغيتها و
اشيلتها من الفوق هيعطينا المجموع الإجمالي نجربها و
نشوف عشان توضح الفكرة هاي
أخدنا ال query فيها مشكلة اه فيها مشكلة
برضه هتعمل مشكلة .. الحين .. الحين بظبط هي
فيني notepad عشان أسهل أحل الشغل هجد أعمل هذه
underscore عشان ماتعمليش مشاكل
هذه أخذتها I based قبل ما نشوف النتيجة طلعوا عندكم
على الجدول القوارب لونهم أحمر 102 و 104 صح؟ في
جدول الحجزات .. في جدول الحجزات كم مرة محجزين؟ 102
كم مرة؟ و 104؟ يعني لازم يعطيني مرة اتنين و مرة
تلاتة هاي enter أعطاني ال BID 102 تلات مرات 104
مرتين ليش؟ لأنه عملهم groups حسب الرقم تبع ال BID
لإن عملت group by ال BID لو شيلت group by BID هي
أول شيء بده أشيل ال group by BID طب بنفعل أنا أخد
هدي هيك بدون ال group by BID و أحطها لازم أشيل ال
BID من فوق صح أن أنا مش موجودة ال BID لما بده أشيل
ال group by لازم أشيلها من ال select طيب هي
هنشيلها من ال select وهناخد select ال count كامل
لأن هو هيجيبلي الحجزات لأي قارب لون أحمر لهم كلهم
مع بعض كام لازم يعطيني؟ لازم يعطيني خمسة عرفنا كيف
ممكن نعمل queries فيها group by فيها having ايش
علاقة ال primary key في الموضوع كيف انه ممكن الاشي
اللي مش موجود في ال group by مش ممكن احطه في ال
select
الآن في عندي كمان query لنعمل find لل age لل
youngest sailor with age أكبر من 18 for each
rating نفس اللي كنا عاملينه أول بس فرق صغير في
الآخر في ال having with at least two sailors of
any age احنا في الأول كنا كاتبين of at least two
sailors في ال group الآن two sailors of any age
بدون شرط ال 18 يعني ال count اللي بده اعملها في ال
having ما إلها علاقة في العمر المثال الأول طلعوا
على هذه الكويري كيف شكلها في ال having كان عندي ال
having في عندي count أكبر من واحد هيك كانت هاي
having ال count أكبر من واحدلكن هذه تتطبق على ال
group اللي احنا اصلا شيلنا منها مين اللي عمرهم اقل
من 18 الان انا بدي اطبق الشرط بس ايش بدي بدي حتى
اللي عمره اقل من 18 احسبه في الشرط تبع ال having
فمش هيظبط اعملها هيك لازم اروح في ال having اعمل
sub query تروح تجيبليهم تعملهم grouping زي هذه نفس
هذه ال query تعملهم grouping بال rating لكن بدون
بدون ال where؟ ليش ايش؟ كنا شرط العمر في الأول،
بما أننا في ال group بنرشعنا كل سنة، كأننا لغنات
حين نحكي ليش؟ طلعي السؤال ايش مكتوب، تعرفي ليش،
لأن إحنا طالبين إنه بدنا ال young sailor لازم يكون
عمره أكبر من 18، يعني الأقل من 18 ما بده يعتبره
young sailorعشان هي حطيتها ده الشرط لكن في ال
group اللي بده اظهرها مش فارقة مع ان اظهر group
يكون فيها ناس اقل من 16 لكن لما بده احسب اللي عمره
اقل واحد اللي 16 ما بده احسبه يعني يجي على ال
group العشرة اللي فيها اللي عمره 16 اللي هو اقل من
18 ال group العشرة كم واحد فيها اللي ال rate
تبعهم عشرة اتنين واحد عمره 16 والتاني 35
لما بده اطبق query زي هذه هيطلع عندي ال minimum
age مش 16 35 لإن انا اللي عمره اقل من 18 شلته لكن
ال group كلها ما حذفتها لانه مش ضايل فيها غير واحد
لأ طلعت على ال group قبل الحذف كم كان العدد فيها
كمان مرة مثال .. مثال على الطلاب يمكن أسهل يكون
للفهم أنا بدي أطلع أقل طالب عنده علامة لكن بشرط
ما يكونش راسب الراسب كام علامته؟ أقل شيء .. الأقل من
ستين يعني أنا بدي .. الرسوب عندكم بيبقى اربعين؟
ستين، تمام؟ فانا بدي أحط ال where العلامة بتاعته
ال mark أكبر من تسعة و خمسين مثلا أو أكبر من أو
تساوي ستين لكن في ال group بتاعة الطلاب ما يهمني
عدد الطلاب ايش كانت علامتهم أنها أقل من ستين ولا
لأ؟ وصة الفكرة؟ لأ طيب عشان توصل بس بدي اعمل select
واحدة منهم اللي هي select اللي في ال sub query
اللي تحت هاي
ال select هاي تبقوا معايا بنات عشان نخلص بس هاي ال
query select ال count from sailors where ال rating
مش هتطلع هاي لإن هو مربوطة في ال query اللي قبلها
عطاني ال counts ساعة ال groups الواحد اتنين تلاتة
اتنين اتنين واحد بدون مافيش where مافيش اي شرط على
العمر مش حاطن اي شرط على العمر مين ال groups اللي
فيها اكتر من واحد واحدة اتنتين تلاتة اربعة اربعة
groups المثال اللي احنا حلناها سابقا كم group طلع
عندي بس تلاتة groups هايهم هدول التلاتة التمانية
والسبعة والتلاتة
عرفت ايش الفرق اللي أنا بدأ أوصل له؟ بدأوطلع حتى ل
group اللي شيلنا منها اللي عمره أقل من 18 لكن
ما بدأنا احسب عمره ك minimum age هاي الفرق الوحيد
بينهم بكتفي بهيك بنكمل للمرة اللي جاي ان شاء الله
نتكلم عن ال null values نتكلم عن ال joints