أحنا المرة الماضية وصلنا لعند ال example اللي احنا
شايفينه اللي هو عبارة عن nested query مع ال group
by وال aggregate functions الفرق بين المثال هذا
والمثال السابق المثال السابق كانت ال having بقارن
كنت فيها ال count star أنها تكون أكبر من واحد إيش
يعني ال having ال count star أكبر من واحد يعني كل
group احنا عملناها في ال group by بدناياها يكون
عدد ال rows اللي فيهاأكبر من واحد يعني إذا كان عدد
ال rows zero or one مابديها النتيجة force مابدي ال
group هذه الآن الاختلاف عندي في المثال هذا أنه أنا
بدي ال group ال count تبعها مابدي أعد بس ال
sailors اللي عمرهم أكبر من 18 بدي أعد كل ال
sailors حتى لو كان عمرهم أقل من 18لو استخدمنا
الطريقة الأولى طريقة الأولى هيطبق ال count star
على نتائج query هاي اللى فيها الشرط انه اكبر من 18
كيف تتغلب على المعضلة هاي الحل ان اروح اعمل query
تانية شبيهة في الأولى بدون الشرط هذا ال where و
احسب فيها ال count اللى انا بديها فهي اللى عملناها
عملنا نفس ال query هاي selectcount star from
sailors مافي شرط ال wear ال sh أكبر من 18 بدون هذا
الشرط وعشان أضمن أنه ال rating اللي أنا بعدله ال
count هو نفس ال rating اللي موجود في ال query
الأصلية عملنا correlation ذاكرين ال correlation؟
ذاكرين لما حكينا إيش يعني correlation في نفس ال
queries؟ إيش يعني correlation في نفس ال queries؟
أخدناه في الشتر هذهحكينا طب إيش عن nested queries؟
أصل إيش عن nested queries؟ ال query جوها query
حكينا ال correlation إنه ال nested query اللي جوا
هي ال sub query اللي جوا يكون فيها variable من برا
فاحنا هيو ال variable من برا ال S rating بيساوي ال
S2 rating ال S2 rating من وين جاية؟ من أي query؟
من التانية هاي sailors S2 هاي من التانية بينما ال
S dot rating من وين جاية؟ من الأولىسمينا هذا ال ..
ان اربط variable او كولوم موجود في ال parent في ال
main query اربطه مع ال sub query سمينا العلاقة I
correlation ان اربط ال two queries مع بعض فاحنا
ربطناهم مع بعض هذا الشرط ايش بتمنلي؟ بتمنلي ان ال
rating اللي انا بحسبله ال count في ال sub query
هذه هو نفس ال rating اللي انا بديه اللي موجود برا
فانا هعد عدد ال sailors اللي من نفس ال rating بغض
النظر عن عمرهم بدي أركز بس في المثال اللي عندي على
ال sailors اللي ال rating تبعهم عشرة sailors اللي
ال rating تبعهم عشرة طلعوا على ال example اللي
عندكم ال sailors اللي ال rating تبعهم عشرة كم واحد
اتنين واحد كم عمره الأولفي واحد عمره 16 وفي واحد
برضه rating عشرة كام عمره 35 العمره 16 في ال query
الأولى لإن ال age تبعه مش أكبر من 18 مش هيدخل في
ال query هاي ال query هيش بدها بدها ال minimum age
فال age تبعه هذا العمره 16 مش هحسبه في ال minimum
age لكن هحسبه وينهحاسبه في ال counter لان مافي
عندي شرط ان ال wear age اكبر من 18 فلما احاجي اعمل
ل groups group by حسب ال rating تعالى نشوف ايش ال
groups اللي حدث من الجدول اللي عندي هعمل ل groups
المرة هذه ال group بس ساعة العشرة هيكون فيها كمان
زي ما هي 35 فيها بس واحد لإن الشرط اللي عندي ال
age 16 مابديش إياه بدي أنا ال age أكبر من 18 فهي
ال groups الآن ال groups هذه لما رحنا فرزناهم في
ال having المرة الأولى طلعنا بس التلاتة والسبعة
والتمانية على أساس أن التلاتة فيها تلاتة sailors
والسبعة فيها اتنين والتمانية فيها اتنينلكن المرة
هذه ال count ما استخدمتش ال count اللي عادي روحت
عملت query تانية لل count في ال query التانية اللي
عمره 16 هذا هيكون موجود مع العشرة هيكونه اتنين
فهتطلع ال group بتاعة العشرة كمان لكن كام ال
minimum age هيكون جنبها هذه اللي عمرهم عشرة واحد
ستاش وواحد خمس تلاتين كام ال minimum ageخمسة و
تلاتين طب مش الستاش أصغر الستاش أصغر لكن الستاش
محذوف في ال query الأولى اللى بتطلع ال minimum age
محذوف فهيعطينا العشرة بقالها خمسة و تلاتين نجرب
الكلام هذا عملي عشان تتضح الصورة عندنا هاي
نفس ال query اللى كانت مطلوبة معنا
هذه نفس ال query طلبنا ال rating طلبنا ال rating
وطلبنا ال minimum age ال
minimum age aggregate function عشان تظهر عندى
جنبها ال rating لازم ال rating أحطها وين؟ في ال
group by هي موجودة في ال group by group by ال
rating وهي الشرط اللى حكينا عنه ال S age أكبر من
ال 18 سنةو روحنا عملنا ال selected تاني اللي هي
بتعمل count لل sailors بدون شرط و بس ربطنا إن ال
rating اللي بنا نعده لازم يكون نفس ال rating اللي
فوق عشان نعد لكل group لحالنا النتيجة اللي طلعت
عنا إنهم صاروا أربع groups مش تلاتة العشرة والسبعة
والتلاتة والتمانية و ال minimum age في العشرة مش
ستاش مش ستاش ال minimum age ال minimum age خمسة
وتلاتينهكذا نحن بنكون أعطينا مثال على الـ nested
queries مع ال aggregate functions و ال group by
الان لو طلب مني أن أوجد ال name و ال age of the
oldest sailor أكبر واحد في العمر، بدي أوجد اسمه،
مش فقط بدي أوجد عمرهده وجد اسمه لإن لو بدي بس عمره
إيش هعمل؟ ال oldest, oldest يعني إيش بدي؟ max ولا
min ولا sum؟ هنجيب max لمين؟ لل S dot H هاي إيش
هترجعلي؟ أكبر عمر لكن كيف بدي أعرف اسم صاحب أكبر
عمر؟ أحط هوين؟
في ال where nested من ال example اللي لها طيب ماشي
الان فكرة اني اجي اعمل الفكرة البديهية الفكرة
البديهية اللي بتتبادر للذهن اول اشي اني اعمل
select الاسنة مع ال max age from sailors الكلام
هذا مش هيشتغل ليش؟ هذا illegalليش illegal؟ لأن ال
name مابنفعش أحطه مع aggregate function إلا إذا
كان في group by طب لو أنا عملت group by حسب الإسم
معناته هيعمل مجموعات و يجيبلي ال max age مش من كل
الجدول ال max age من كل مجموعة المثال اللي قبل
شوية اللي كان طلعلي كان طلعلي العشرة خمسة و تلاتين
السبعة التمانية يعني هو أعطاني ال minimum في
المثال السابق أعطاني ال minimum في كل groupفانا لو
عملت group by name برضه مش هحل المشكلة لأنه هيصير
يعطيني ال max في كل group الحل أنه برضه بدنا كمان
query ال query تطلع ال maximum age و بعدين أقارنه
مع أعمار اللي موجودين عندي في الجدول و بعرف لمين
ايش اسمه فهنعمل selectال max age هي select ال max
age from sailors طلعنا ال maximum age عرفناه
هقارنه where بده يطلع البحار اسمه و عمره بحيث أنه
يكون عمره هو نفس أعلى عمر في الجدول احنا .. احنا
كبشر مش ككمبيوتر لما بنيجي بنحكي بدنا في الجدول
اللي عندنا اسم أكبر واحد بنبدأ نطلع الأسماء ولا
بنبدأ نطلع الأعمار نفس الاشي بنطلع الأعمار بنطلع
أكبر عمر بالروحشوف إيش الاسم المقابل له نفس الفكرة
فال query هاي لو كتبناها مباشرة هتعطيني error
مافيش داعي أن أجربها هتعطيني error لأنها مش موجودة
في group by لو أنا عملت group by عشان أحل ال error
الأوراق اللي مش هتعطيني error لكن نتيجة مش اللي
أنا بدي إياها هيعطيني أكتر من أكتر من عمر أو أكتر
من اسم لأنه هيعطيني الأكبر واحد في كل مجموع فالحل
هو بالشكل هذا نجرب هذه ال queryعشان نشوف نتيجتها
هياخدناها
زي ما هي دون اي تغيير اعطتنا ايش اسمه بب عمره
تلاتة و ستين و نص هيش اللي عملته اللي عملته انها
او جتت العمر في الأول بعدين رجعت قارنت العمر مع
اللي في الجدول و اللي يلو نفس العمر اعطتنا اسم
طب لو بدنا أصغر واحد في الأعمار هنغير نحط ال men
وين؟ طب بنفع نحط ال average في مثال زيها ده
مافيش صح؟ يعني احنا لو عملنا average هيعطينا رقم
لل average بس مابنضمنش أنه يكون في واحد عمره هو
نفس عمر ال average ممكن بالصدفة أنه يطلع واحد عمره
نفس عمر ال average بس صدفة ماحدث صدفة أما أنه أكيد
يكون في الجدول لأ أما ال min و ال max أكيد موجودين
في الجدول
الان احيانا بعض ال queries تتطلب مني ان اعمل
nesting لل aggregate function نفسها يعني account
او الكلام هذا في ال Oracle في ال Oracle المسموح
لكن في ال SQL 99 standard ممنوع في
عندي مثال انه طالب مني اوجد ال rating لل average
ageبحيث انه يكون ال minimum average age حسب ال
rate يعني بدنا نعمل groups لل rating وفي كل group
احسب ال average age و لل group اللي ال average age
تبعها اقل اشي اطلع يعني
لو زي ما احنا نيجي نحكي مثال على طلاب و العلامات
بدي اوجد average العلامات للطلاب حسب القسم يعني
groups حسب الأقساموالقسم اللى علاماته ال average
أقل شيء بتطلع اسم القسم و average العلامات هذا بحث
انه يكون أقل average بين الأقسام فالمطلوب ان انا
اعمل grouping و اوجد average و بعدين اوجد minimum
لل average كلمة minimum لل average يعني انا بدي
اعمل aggregation على ال aggregation aggregation
function على ال aggregation functionفكويري بهذا
الشكل select ال rating from sailors where ال
average age بيساوي select ال minimum average لل
age from sailors و group by rating اشي زي هيك هذا
في SQL standard ممنوع اول سبب انه في SQL standard
ممنوع في SQL standard ممنوع احض زي هيك minimum
average minimum of average هيك بين اقواس nesting
ممنوع
الليجان طب إيش الحل؟ زي
ما حكيت أنا في ال Oracle مسموح ال nesting بس ال
aggregation ممنوع في ال SQL standard الحل
الصحيح في ال Oracle بهذا الشكل إن انا هاجي أعمل
select لل rating و ال average age و أعمل group by
ال rating سيبوكم الكلام اللي موجود تحتselect لل
rating و average age group by rating ايش بتعمل هاي
بدون هذا اللي تحتها هتطلعلي ال average لل age
مظبوط طلعلي جنبه مين ال rating و تكون المجموعات
حسب مين حسب ال rating ايش ال ratings اللي موجودة
عندنا في الجدول في عندنا واحدإتنين مش موجود تلاتة
موجود بعدها سبعة و تمانية و تسعة و عشرة صح في هاي
ال groups ال rating لما أعمل ال groups حسب ال
rating هاي ال groups واحد و تلاتة و سبعة و تمانية
و تسعة و عشرة في كل group بنشوف مين الموجودين ضمن
ال group و بنحسب ال average تبع أعمارهم هتطلع عندي
أرقام معينة مثلا هنعبيها
الان بعد الكلام هذا حطينا شرط وين؟ في ال having مش
في ال where شرط على مين؟ على group انه انا بدي اقل
group انه انا بدي اقل group فهعمل having ال
average age هذا الرقم اللي طلع معايا ال
average age يكون بساوي ال minimum average لل age
واحظوا عمنا ايش؟عملنا ال nesting هذه مسموحة في ال
oracle في ال oracle مسموحة فحسب ال minimum فيهم
نفرض طلعت هذه بده افترض فرضا طلعت الرقم هذا select
the minimum average age from sailors grouped by
the rating بعد ما تطلع معايا القيمة هذه مثلا نفرض
القيمة هذه كانت 35 على فرضفهيروح يسويها مع مين مع
ال average age اللي حسبناه نفس ما عملنا في ال name
تبع اسم أكبر واحد فهيقارنها هيلاقيها أنها هي نفس
القيمة اللي بقى للسبعة يروح يطبع لمين بالضبط
لإن عشان نفهم إيش اللي بيصير هعمل كل query لحالة
ال Oracle ونشوف نتيجتها هاي
هاخد هذه ال query ال sub query لحالهاهياخدت ال sub
query لوحدها
ماذا أعطتني؟ 25.5 مليون دولار ماذا حسبت ال query
هذه؟ حسبت ال average حسب ال groups حسب ال group
على ال rating عملت ال group على ال rating و حسبت
ال average و عملت minimum لل average أقل ال
average كان عندي 25.5 لكن مين هي ال group مش
عارفين فهناخد القيمة هاي 25.5 مقارنها مع ال
averages اللي عندنا و اللي له نفس ال average هتكون
هي ال group اللي احنا بدناياهاالـ query التانية
بدون ال having شايفين احنا هاخدها بدون ال having
عشان نشوف برضه ال query الأولى إيش بتطلع لوحدها
تطلع كل ال averages حسب ال rating إيش أعطتني؟
أعطتني جدول في ال 1 وال8 وال3 وال7 وال10 وال9 من
اللي كتبناهم بس مش بالترتيب لأن ال database مافيها
ترتيب وراح حسب ال average على كل group لاحظوا من
ضمنهمالـ 25.5 هذه وهي أقل واحدة فهي أقل منها فانا
اللي هعمله أنه هحسب هذه ال query و ال query
التانية اللي أعطتني نتيجة ال 25.5 و أعمل بينهم
يساوي فهتكون النتيجة أنه مين ال group أو مين ال
rating اللي له أقل minimum average عشرة أنا بدي
النتيجة تطلع زيك عشرة مع ال 25.5
هي ال two queries مع بعض ربطناهم من خلال انه عملنا
nesting في ال having عطتني
النتيجة اللي احنا متوقعينها حسب حساباتنا انه ال
rating عشرة هو له اقل minimum average في الأعمار
اللي هو خمسة و عشرين و نص طب لو بدنا
ال maximum sum بديش اعمل average للأعمار بدي اعمل
sum للأعمار جامع للأعمار و بدي ال group اللي لها
ال maximum sum نفس ال query ايش بدي اغيره هاي نفتح
ال query اللي عندنا
لو بدي انا ال group بدي اعمل groups حسب ال rating
و بدي ال group اللي لها اكتر مجموع أعمارالـ
average age ده إيش ده تصير sum ده تصير sum مجموع
لل age ال
having الشرط اللي عندي إيش هيتغير فيه برضه sum sum
ال age هاي برضه ده تصير sum ال s dot age لإن ال
select هاي بدل minimum average إيش ده تصيربس يال
maximum sum maximum
لل sum أي
group اللي هتطلع معاه لو طلعنا لل groupsخسرنا ال
groups و جمعنا الأعمار مين اللي إلها ال maximum
sum هاي
ال groups اللي عندي بس ضيفه على العشرة في روه في
كمان عشرة معها كام ستة عشر مين
اللي إلها ال maximum sumتلاتة تلاتة وستين مع خمسة
وعشرين يعني مية واربعتاش تقريبا مية واربعتاش في
شاتر مية واربعتاش لأ مافيش فالنتيجة المفروض تطلع
عندى كامل هي التلاتة مع ال sum مجموع هدوله تقريبا
مية واربعتاش تلاتة وستين مع خمسين اه مية واربعتاش
بتطلع هذه جواب كبيرةطب كيف نحل المشكلة هذه في SQL
Standard لو احنا ما بنشتغلش Oracle نشتغل SQL
Standard او ممكن على database تاني غير Oracle
MySQL نفرض او اشي تاني الحل اللي عندنا اللي ممكن
نستخدمه في SQL Standard عشان ما نعملش nesting انه
نعمل table جديد بس بدل ما ننشغله نعمله create
table بده ننشغله بشكل مؤقتع شكل ال view لمين لل
averages table لل averages و نحسب منه ال minimum
فهنيجي نعمل ال query هاي شايفينها في ال from ال
nesting المرة هاي و لا موجود مش في ال where ولا في
ال having ال nesting هذه المرة موجود في ال from
مافيش عندي from اسم table لأن انا ال from عندي
بتاخد من table انا صنعته جديد view جديدة سميتها
ايش سميتها timالـ view دي إيش فيها؟ فيها ال rating
و ال average group by ال rating بس حسبة ال average
عشان أطلع اللي هو اللي كان طالع معنا الواحد و
التلاتة و السبعة و التمانية و التسعة و العشرة و كل
واحدة معها ال average تبع العمر مقابلها بس table
جديد بس فيه ratings مع averages فقط لا غير أنشأنا
هذا ال tableبعد ما أنشأناه أخدنا منه المعلومتين
هذين ال rating و ال age و حطناهم في ال select timp
.rating timp.rating أي اسمه timp تابل هذا ال view
هي اللي أنشأناها اسمها timp أخدنا
منها ال rating و ال average هذا أي سمينا average
underscore age timp.average underscore age هنروح
نعمل شرط أنه أنا بدي ال average هذاunderscore age
يكون بساوي اللي في ال query هاي ايش جوا ال query
ال minimum لها minimum ال average age لان ناحظوا
في ال example هذا هل احنا مستخدمين nesting لل
aggregation يعني aggregation ورا aggregation
مباشرة زي هيك minimum و average ورا بعض مافيش ال
minimum انا مش حاط بعدها aggregate function حاط
بعدها column ال column هذا اصلا انا حسبته من
aggregate function
يعني زي احتيال على المشكلة احتلنا عليها عملنا view
جديدة فيها ال averages وعلى ال view عملنا minimum
ع ال table الأصل عملنا بس average ع ال sailors بس
عملنا average ماعملنا minimum ع ال table الجديد ال
tim بروح نعملنا ال minimum حل مؤقت طبعا انا
المطلوب منكم اللي بدي اكم تفهموه الحل تبع القراكي
اللي هو أولا أسهل تاني ان انتوا أصلا بتاخدوا في
المعملأوراكل ممكن يعني لما تشتغلوا في المشروع تبقى
كم حتى تشتغلوا أوراكل فانا اللي باطلب منكم انكم
تفهموه و بحسبكم عليه هو الحل تبع الأوراكل مش الحل
السابق بس الحل تبع ال SQL standard 99 معنى انكم
تفهموه عشان لو واحد واجه شغل على database تاني غير
الأوراكل يعرف كيف انه ممكن في حلول تانية بدنا
نتكلم الآن عن ال null valuesبقى العشر دقائق يعني
الخمس دقائق كفاية ال null values أخدناها أكتر من
مرة اتكلمنا إن ال null ليش بنستخدمها ورا
ال null ليش بنستخدمها لما تكون القيمة فاضية blank
مافيش قيمة أو مش معروفة unknown unknown مش عارف
أنا إيش القيمة مافيش address أدخله مافيش اسم بدي
أدخلهفبستخدم ال null ال un-null هذه اللي أنا
بستخدمها في حالات ال unknown و ال inapplicable
unknown يعني مش معروف inapplicable يعني غير مناسب
زي ايش غير مناسب؟ غير مناسب يعني مثلا في وزارة
الداخلية لما بيعملوا الهويات اللي فيه ايش اسمه اسم
العائلة السابق هذا ممكن يستخدموه مع البناتلما
بتتزوج البنت تكون في اسم العائلة السابق واسم
العيلة الجديد اسم عيلة زوجها لكن عند الرجل مايلوش
أي معنى فهذا بنسميه inapplicable يعني في حالة
الرجل ال median name ال median name اللي هو اسم
العائلة السابق للمال للرجل inapplicable مايله معنى
لكن في حالة ال females ممكن يكون له ممكن يكون له
قيمة ممكن مايكون لهش قيمة يكون unknownفهي معنى
inapplicable مابتطبقش مثال تاني عن ال inapplicable
لو انا عندي موظفين ثابتين وموظفين بالساعة عدد
ساعات العمل ممكن انا اكون ادخل للموظف اللي بيشتغل
بالساعة بس الموظف الثابت مابدخله عدد ساعات العمل
فإيش بحكم حلها نار؟ ليش حطت نار لإنها مش معروفة؟
لأ معروفة بس أنا مش معنى ان ادخلها مابتلزم
inapplicable فالنار اللي بنستخدمه مع ال unknown و
ال inapplicableلكن وين المشكلة؟ المشكلة أن الـ
null هذا بعمل لي complications في ال comparisons
يعني أنا بفهم لما بقارن رقمين بفهم إنه خمسة أكبر
من تلاتة لو هيك كان الشرط، هيعطيني true لو يلينا
عاملنا خمسة أكبر من عشرة، هيعطيني false طب لما أجي
أحكي خمسة أكبر من .. و القيمة اللي أنا بفحص فيها
مسجلة في ال database null إيش بدنا نحكي true ولا
false؟فبيعملني النار اللي بيعملني تعقيدات لأن إيش
بدنا نحكي بيصير بدنا في ال database three valued
logic يعني أنا في ال database مابشتغل بس على logic
فيه true و false بشتغل على logic موجود فيه ال true
و false و unknownأي comparison بعملها نتيجتها يا
إما true يا إما false يا إما unknown بطل المفهوم
التقليدي اللي كان عندنا زمان اللي إحنا متعلمينه
أنه أي مقارنة بينتج عنها true و false لأ صار الأن
في عندي true و false و unknown المقارنة بين الخمسة
والنل نتيجتها unknown مش معروفة لأنه لما أعرف أنا
قيمة النل و أجي أعبيها بعدها بصير أعرف أنه ممكن
تكون true و ممكن تكون falseيعني انا مثلا بدي عمر
شخص معين مش مسجدين تاريخ ميلاده في ال database
فالعمر null لما اعرف تاريخ ميلاده ممكن اتفاجأ ان
عمره يطلع عشرة فتكون نتيجتها false او يطلع عمره
اربعة فتكون نتيجتها true فانا فعليا حاليا مش عارف
انها لا true ولا false انا ايش بعرف بعرفش ايش اذا
unknown النتيجة لل logic unknown فاللي بدنا نفهمه
ان ال answer انها true و false andunknown عشان
افحص ال null لما اجي انا بدي افحص قيم زي ما انا
بفحص انه ال age اكبر من كذا و بفحص انه ال address
موجود في غزة و بفحص انه الاسم كذا او رقم الطالب
اشي رقم معين ال null في ادوات لفحصه في ال database
في ال where و في ال having عشان افحص في ال where و
ال having ادوات الفحص لل null ايش همأسف هدل ال
constraint أدوات الفحص اللي هي is null و
is not null لما أنا بقارن value ممكن أستخدم ال is
null أو ال is not null فإذا كانت null و أنا طلبت
إنه is null هيعطيني إيش؟أنا بفحص في ال value في
address بدي أشوفه مسجل ال address للطالب هذا ولا
مش مسجل بحكي address الطالب is null و هو فعلا null
إيش هيعطيني؟ هيعطيني true و إذا كان مخزن إله
address فيه قيمة هيعطيني false و ال is not null
العكسيعني لو احنا طلبنا منكم انه طلعولنا اسماء
الطلاب اللي مش مسجلينهم رقم جوال في ال database
بتاعة الجامعة ايش شكل ال query بدو يكون؟ بدو يكون
select ال student name from ال students where
الرقم الجوال
is null عشان إذا كان فاضي يطلع اسمه عندى نروح
نتواصل معاه نحكيله تعالى حدث بياناتك دخل رقمك
فاحنا بنستخدم ال is null و ال is not null للفحص و
بنستخدم ال not null constraint لما بنبني الجدول
لما بنعمل create table عشان أضمن إذا أنا بدى كلم
معين ما يكون جوا null
الـ not null constraint أخدناه وشرحناها سابقاً أنا
بستخدمه عشان أضمن إن كلمة معينة ممنوع يكون null
لازم ندخله قيمة بدون أن ندخله قيمة ال insert مش
هتشتغل هينعملها reject واضح؟ هنكمل المرة الجاية في
موضوع ال null إيش أثره على ال arithmetic و ال
comparisons و إيش أثره على ال union و ال intersect
و الأمور هذه