أنا أعمل مادة وصنع لأجل الـ Functions وكلمنا عن أن
في بعض Functions في الـ database تشتري على نفسها
الـ rows كلها لا تطلع لك كلها، معين لأ تشتري على
الـ rows تعطييني معلومة إجمالية، مثلا بدي count عدد
الأشخاص أو عدد أسطول، بدي sum إذا كنت مثلا بواتر
بتعرف رواتب، مجموعة رواتب الموظفين في قسم معينة في
الشركة أو في project معين، بتعملهم صمم، بتعملهم
جمال أو بتطلع الـ average للرواتب، معدل أو معدل
للعمار، average للعمار، per case الكلام هذا مش مخزن
في الـ database، الـ database فيها cage لكل موظف أو
لكل طالب، إذا أنا بيدي معدل، أنا بيدي الـ average
لعلامات الطلاب، أنا بسيط يراني في الـ database علامات
كل طالب
أقل علامة، الكلام هذا كله نتيجة من مجموعة من الـ
functions نسميها aggregate functions، وعن مجموعة
كبيرة في الـ database، نحن بناخد منها مجموعة صغيرة
نشرحها، أنتو في المستقبل يعني إشتريتوا في مشاريع
عملية فيه functions أكتر منها، أهم الـ functions
اللي عندكي نتعامل معها، الـ manual maps المعطيها اسم
الـ column، الـ column هذا لازم يكون فيه قيمة، مش
مضطر نعمل max لـ address أو max لاسمهم يعني
meaningless مالوش أي معنى، سواء ممكن أعمل max و
max لعلامة، لـ GPS ممكن لـ salary، لراتب ممكن الـ
price، السعر، البعض ممكن لعدد القطر أو عدد الكتر في
محف ذاته فهي شديد أقام max أو max ونحط اسم الـ
program الـ A هذي، A is a singleton فضع الـ max و
الـ max في نفس الشيء في average، average لكلم برضه الـ
average بتدها زي الـ minimum و الـ maximum، بتدها رقم
لكن بيميز الـ average، ممكن آخد معاه كلمة distinct
ايش يعني average distinct أيه؟ يعني أنا بقدر أطلع
العناصر اللي في الـ column أيه، ماتضطررش، وبعدين
عملنا average، يعني إحنا لو كان عندنا في column معين
كان فيه عشرة، عشرة، تسعة، تسعة، تسعة، واحد، الـ Average
تبع كلهم هذا، كلمة واحد زي التسعة زي التسعة زي
التسعة زي التسعة زي التسعة زي التسعة زي التسعة زي
التسعة زي التسعة زي التسعة زي التسعة مقصود على
عددهم، وكم عددهم؟ ستة، عجبهم كلهم على ستة، لكن إذا ما
أعمل average distinct فيه، العشرة هياخد منها واحدة
التسعة هياخد منها واحدة، الواحد هياخد بس واحد، عجم
واحد زي التسعة عشرة زي التسعة عشرة وعشرين على
تلاتة، عشرين على تلاتة، تقريبا ستة وكذا أو سبعة.. من
الستة والسبعة تمام؟ ألف ونعين ستة point كاسر معين
عرفنا ايش يعني average للـ A للكلم A أو average
distinct للكلم A؟ distinct هشيل التكرار من الكلم
نفسه، هذا غير الـ distinct اللي في الـ select، غير الـ
distinct اللي في الـ select، الـ select distinct
بطلع القصة اللي ما فيش فيها تكرار، قصته كاملة هي
بتطلع نفسها على الـ column، طب ليش الـ max والـ min ما فيش
meaning distinct؟
مالوش معنى، يعني أنا لو حاطه من الـ distinct ولا
منهية، مالوش معنى، هعطيه نفس النتيجة، هعطيني هو
رقم واحد، يا min يا max، أما الـ average بتأثر في
عدد الأرقام اللي مجمعها، نفس الشيء الـ sum، مجموع
هدول العشرة مرتين وتسعة تلات مرات وواحد، مش نفس
مجموع العشرة مرة وتسعة مرة وواحد مرة، نفس المجموع
مش نفس المجموع، فالـ sum برضه فيه sum distinct أيه
وفيه sum أيه، الـ min لو بدي أطلع الـ min من الـ min
واحد سواء بتتكرر أو بدون تتكرر، الـ max والـ max
عشرة سواء بتتكرر أو بدون تتكرر برضه الـ max عشرة، الـ
count بتتأثر من الـ distinct، لو كنت أحكي count star
أو اسم الـ column، I mean أحطها star أو أحط اسم الـ column
هيجي عندك، عشان أعطيه count ك 6، إذا أعطيته count
distinct اسم القلوب، فهيعطيني بس تلاتة أرقام هدول
مش مفروضين هدول كلهم، من أجل أدفع مشاركتهم يمكن
أستخدمهم، يمكن أستخدمهم في queries بهذا الشكل في
query، المثال الأول عندي select count star من سلة S
بدون أي شرط، بدون معنى، أنا هأبدا عدد القصة طب طبعا
مافيش دول عندنا، كام واحد موجود؟ عشرة، عشرة؟ طيب،
واحد، اثنان، ثلاثة، أربعة، اتنين، ستة، اتنين،
تسعة، عشرة، اتنين، تسعة، عشرة، اتنين، تسعة، عشرة،
اتنين، تسعة، عشرة، اتنين، تسعة، عشرة، اتنين، تسعة،
عشرة، اتنين، تسعة، عشرة، اتنين، تسعة، عشرة، اتنين،
تسعة، عشرة، اتنين، تسعة، عشرة، اتنين، تسعة، عشرة،
اتنين، تسعة، عشرة، اتنين، تسعة where الـ rating
بيساوي عشرة، هشغل الـ query الطبيعية، بدي أطلع الشرط
عندي لازم الـ rating كان بيساوي عشرة، كم واحد اللي
عندهم عشرة rating؟ اتنين، صحيح؟ هيجي على الـ age
اللي لهم وأجمعه وأقسمه على اتنين عشان يطلع لي الـ
average، كم أعمارهم الاتنين اللي عندهم عشرة؟ خمسة و
تلاتين وستاشر تطلع تقريبا خمسة وعشرين ونص يمكن،
مش زي هي، فهتكون نتيجة تقريبا خمسة وعشرين اللي
بعديها select count distinct للـ rating، يعني أنا
بدي الـ rating بدون تكرار، أعدهم كام rating موجودين
من جدول السيلرز، سيبوكم من الشرط بدون الشرط هذا، لو
حذفنا الشرط كام rating عندي؟ عندي عشرة بحارة وفي
ratings مكررة اللي distinct ومش مكررين، ستة في
واحد في سبعة وثمانية هي صاروا تلاتة وعشر هي أربعة
وفي تسعة في تلاتة وستة، فهتعطيني نتيجة ستة، لكن لما
حطينا الـ where، where الـ rating بيساوي بب، طبيعي تكون
نتيجة واحد لأنه ما فيش عندي غير بب بس واحد، بب، طب لو
كانت Horacio بدل بب، لو كانت Horacio في عندي اتنين
اسمهم Horacio وكل واحد الـ rating تبعه مختلف..
مختلف فهيعطيني اتنين، طب لو كان الاتنين اسمهم
Horacio ولهم نفس الـ rating، برضه هيعطيني واحد، ما
شاء الله اليوم، فاتحيني منيح نزين
شوية بدنا ن.. بدا نستخدم الـ aggregate functions مع
nested queries زي المثال هذا، ممكن أستخدمها في
nested query، في الـ nested query هاي أنا طالب
select الـ max للـ rating من جدول السيلارز، ولاحظوا
سميته S2 لأنه أنا بستخدم السيلارز كمان مرة في الـ
main query أو في الـ parent query فبدي أميزهم مع بعض
هذا S وهذا S2، أنا بدي الـ max للـ rating، كام الـ max
للـ rating عندكم؟ عشرة عشرة عشرة عشرة عشرة عشرة
عشرة عشرة عشرة عشرة عشرة عشرة عشرة عشرة عشرة عشرة
عشرة عشرة عشرة
from sailors الـ rating بيساوي عشرة، بحدد الشرط إنه
الـ rating عشرة اللي هم عندي اتنين، أنا الـ rating
تبعهم عشرة في الجدول، بيدطلع الـ average للـ age
تبعهم بس بالشرط إن يكون distinct، طب هم اللي هم نفس
الـ age ولا بخلف؟ بخلف، يعني لو أنا حطيت distinct أو
ما حطيتهانفس النتيجة، ليش؟ لأن اللي اللي لهم الـ
rating عشرة هم أصلا أعمارهم مش مكررة، يعني ما في
تكرار في أعمارهم، بس لو في تكرار، بصير الـ distinct
هذه لها ايش؟ لها تأثير، يعني لو إحنا جبنا الـ query
هذه بدون distinct أو حطينا الـ query نفسها كمان مع
الـ distinct، حكينا لكم مثلا سؤال true أو false و
قدامكم الجداول كانت، حكينا لكم هدول بيعطوا نفس
النتيجة true ولا false؟ true بتعتمد على الجدول اللي
عندنا، تكون تحسبوا الـ two queries ونتأكد إنه نفس
النتيجة، تحكولي true إذا الأرقام، ممكن نغير في
الأرقام في الجدول بحيث أنها تطلع false، ممكن
أجيب لكم أسئلة زي هيك في الـ final، two queries و
تقارنوا بين نتائجهم بناء على الجدول الموجودة و
تحكولي إن مثلا دول the same أو في فرق بينهم، طيب
بتحبوا نجرب إشي من هدول كله، okay ماشي
لو أنا بدي find the name and age of the oldest
sailor، بدي الاسم والـ age لأكبر بحار، حين أكبر واحد
في العمر، هستخدم الـ max age هتعطيني أكثر عمر، لكن لو
كتبت query بهذا الشكل select الـ name match the age
of the sailor
آه هذه مش هتنفع، illegal، illegal ليش illegal لأنه
إحنا هذا الـ column مش موجود أصلا في الـ table بهذا
الشكل، فيه age بس ما في max age، فقدرش أربطهم مع بعض
مباشرة، بدي أحط هذه في query وأفحص الـ name إنه الـ
age له بيساوي الـ max age، فالشكل اللي إحنا لازم
نستخدمه لازم تكون بهذا الشكل إن أنا أوجد الـ name و
الـ age في age في كولوم اسمه age بس مافي كولوم اسمه
max age عشان أربطه مع الـ name في نفس الجدول و بدي
أفحص إن الـ age ده بيساوي query تانية بطلع فيها الـ
max age الكلام هذا بيوصّرني لإشي بدي أتكلم عنه إنه
إحنا لما بنحط aggregate functions في الـ select أي
select فيها aggregate function زي هذه لازم الـ
columns اللي جنبها يكونوا يا إما كمان aggregate
functions يا إما بدهم يكونوا موجودين في جملة لسه ما
أخدناها نبدأ نشرع عنها الآن اسمها group by عملية
تجميع إنه نعمل grouping group by هنشوف الكلام هذا
بالتفصيل الآن في الـ slide ده التاني بس مش عارف
نفسي نجرب إشي تشوفوه عمليه من وين نعمل في هاي ولا
في هاي في التاني في التاني إيش نعمل where الـ S إيش
بتسوي إيش؟ لأ ما بينفعش مش هيخليني هتصير نفس فكرة هذه
max age لمين؟ مش هيخليني لإن هنشوف التنتين نشوفوا
التنتين على الـ Oracle ونشوف مين هيخليني أعملها
ومين مش هيخليني أعملها وإيش القرر اللي هيعطينيه
هنفتح الـ Oracle
هيك بيبين الشاشة هيك
بيبين عندكم؟ حكينا إيش بنعمل select للـ إيش للـ ..
للـ S.Snail وكمان لمين؟ للماكس s.age صح from sailors
في
عندنا شرط ولا بدون؟ بدون شرط كانت الأولى صح؟ إيش
أعطاني not a single group group function فهو بده
الـ S name هذه وين حط الـ star اللي عليها النجم هذه
وين الـ error ومكان الـ error حطها على الـ name على
الـ S dot S name شايفينها؟ فمعناته هو مش عاجب وجود
الـ S name مع الـ max لكن أنا لو حطت الـ max age
لحالها مافيش مشكلة هاي بدنا نحط الـ max select الـ
max للـ S age from sailors عادي أعطاني الـ max حكاية
لي أكبر واحد في العمر تلاتة و ستين و نص عمر طيب
كيف أطلع اسم صاحب أكبر عمر؟ هو الـ max age موجود في
الجدول مش رقم حسابي زي الـ average الـ average ممكن
ما يكونش في الجدول واللي بحكي غلط أنا average ممكن
ما يكونش في الجدول لإنه ممكن يطلع كثر ويطلع إش مش
موجود بس الـ max و الـ min أكيد موجود في الجدول طب
أنا بيدطلع صاحب الـ max age هذي بيدطلع اسمه و
بيدطلع رقمه إيش بدنا نسوي عشان يطلع معنا؟ بيدعمل
select الـ S.S name و بيدطلع عمره كـ S.H from sailors
S ولأ بدي أحط شرط الشرط هذا بنجرب أنه نعمل where الـ
S.H بساوي زي ما حكت مين اللي سألت؟ مريم مريم
كان سؤالك إنه بنحط إحنا max الـ S.H كـ standard SQL
المفروض ما يرضاش، ما عرفش الأوراق اللي هترضى ولا لا،
بنجرب هاي الـ max S.H، إيش هيك بدك؟ لأ مش أنت آسف
إحنا بنأكد المعلومة إحنا بنتعلم ما فيش فيها أسف
اعطاني إيش نفس المشكلة حكاية الـ max مالها ما فيشش
group function not allowed here ما فيشش grouping مش
هيرضي اعطانيها نفس المشكلة إن أحط الـ max age فوق
جنب الـ S name فإحنا الحل الحل إن أنا أعمل select
الـ S name و الـ age from the sellers و الـ where اللي
كنا حاطينها بس بدنا نطلع الـ max s.h هي بدنا نطلعها
من خلال select عشان يرضى ياخدها فبدي أعمل select
جديدة هعمل فيها select اللي هو اللي أنا بدي ياله
الـ max للـ s بس إيش بدي أعمل؟ مش s اسم تاني s2.h
from
حدش يحكيليش منزلتش سطر جديد عارفين ليش ما نزلتش سطر
جديد؟ لإنه عادي، بتفرشوا لعند ما يشوفوا السيميكولوم
إن شاء الله كلهم مكتوبين في نفس السطر from sailors
is to .. في عندي كمان where؟ صحيح؟ from sailors
بلزمني where ولا بلزمش؟ بلزمش؟ بس هيك خلاص؟ كفاية؟
هاي enter
زبطت و أعطاني الاسم و زي ما أعطاني الاسم ممكن أحط
جنبه الاسم أو أحط الـ number إذا أنا بدي number أو
أحط اللي بديه طلعلي الـ max تلاتة و ستين و نص و
طلعلي الاسم إنه Bob كيف طلعهمه فعليا عمل الـ max في
query لحال و الرقم اللي طلع معنا قارننا عملنا الـ
where مقارنة مع الـ age نفس الـ query هذه إحدى فوائد
نفس الـ query إنه أنا بدي أطلع أكبر عمره أكبر علامة
إشي ما بعرفه و بدي أقارنه مع باقي المعلومات عشان
أسترجع باقية المعلومات من الـ table راح وقت كتير
عشان الكهربا نرجع
للـ slide ده Find the name and age of the oldest
seller حلنا المشكلة هذه حكينا إن الـ query بهذا
الشكل illegal ليش؟ لأنه ما فيش فيها grouping للـ name
ممنوع أي إشي ما لهوش grouping يطلع جنب aggregate
function الـ grouping اللي نحكي عنها الحل الصحيح هو
بالشكل هذا اللي جربناه على الأوراق دي طيب إيش
السبب إن إحنا بنحتاج نعمل اللي هو الـ grouping هذه؟
لحد الآن الـ grouping إحنا الـ count و الـ sum و الـ
average و الـ win و الـ min و الـ max بنعملهم بنعملهم
كله على كل الجدول طب أحيانا أنا بالزمن بدي أعمل الـ
function هذه الـ sum أو بدي أعمل الـ function بتاعة
الـ average مش على كل الجدول، على مجموعة محددة من
الجدول يعني أنا بدي average العمر للبحارة بشرط
إنهم يكونوا في نفس الـ rating في نفس المستوى في نفس
المستوى بدي average معدل الطلاب بشرط إنه أرتبهم
حسب سنوات التسجيل يعني بدي 2014 لحال 2015 لحال
2016 لحال بدي سنة التسجيل بناء عليها أطلع الـ
average ما بديش average لكل الطلاب أو بدي average
للطلاب حسب القسم يعني أنت شوف average معدل الطلاب
في قسم الـ computer science مقارنة في الـ average
تبع معدل الطلاب في الـ multimedia طبعا الـ
multimedia هيكون معدلهم
مع تعوين الـ software engineering مع الأقسام
التانية مع الـ mobile القسم الجديد هذا بقارن بينهم
بين الأقسام في هذه الحالة بدي أعتمد على موضوع الـ
grouping لأنه هحتاج grouping بدي أوزه أعمل groups
groups بناء على column معين بعمل group بناء على
column كل group مثلا بناء على الـ department group
بناء على الـ age كل فئة عمر محدد مع بعض كل rating
محدد مع بعض ده نعمل group الفكرة إنه أنا لو ما فيش
عندي grouping بدي إشي زي الـ four loop في البرمجة
بحيث إنه أنا مثلا بدي select الـ min age و الـ
minimum age للـ sailors بشرط إنه الـ rating تبعهم
يكون واحد و بعدين الـ rating يكون اتنين الـ rating
تلاتة الـ rating أربعة مش هيك معنى الـ group إذا
أفضل أعمل group على الـ rating معناه إن الـ rating
تبعهم one لحالة two لحالة three لحالة four لحالة
five لحالة فعشان أعمل الـ groups هذي بدي زي four
loop
الـ I هي تتغير ما فيش عندي for loop في عندي groups
أسهل في الشغل في الـ .. في الـ SQL هتصير عندك query
بالشكل هذا إنك بتعمل select للـ SID أو للـ name from
sailors where الـ age in select الـ من age from
sailors group by rating group by rating هذه هترتب
ليه الـ sailors عندي حسب الـ rating يعني لو طلعنا
هنا على الجداول اللي معناههلج ده اللي معناه عندي
السبعة هي في سبعة غيرها هي هم هدول اتنين هيصيروا
في group الواحد هذا في حد معاه هذا هيطلع الـ group
لحاله التمانية هدول اتنين group العشرة الاتنين
هدول group لحاله التسعة لحاله التلاتة هدول لحاله
صار عندي كام group؟ واحدة اتنتين تلاتة اربعة خمسة
ستة ستة groups في كل group في كل group على الـ
rating هيروح يعملها من للـ age أقل الـ age تعالى
نشوف إيش النتيجة الجروب الأولى بتاعة السبعة إيش الـ
من الـ age؟ خمسة و أربعين؟ ولا خمسة و تلاتين؟ خمسة
و تلاتين الجروب التانية ما فيش غيره تلاتة و تلاتين
الجروب اللي بعديها خمسة و عشرين مع خمسة و خمسين و
نصفكم هتطلع؟ خمسة و عشرين و نص طيب
العشرة خمسة و تلاتين و ستاش هتطلع عندي ستاش اللي
بعديها هي فش غير لحاله خمسة و تلاتين خمسة و عشرين
و نص نتيجة الـ query هتكون عندي ست نتائج بالأرقام
هدوة هذه نتيجة الـ query لما حطينا فيها الـ group by
select the min age from sailors group by ratings
لو أنا بدي أعمل نفس الكلام عن موضوع الـ students
ممكن أنا أعمل select الـ average بدي معدل الطلاب
select الـ average للـ GPA اللي هو المعدل اللي أتركه
من الطلاب from students group by department number
عشان أعلي الـ department number كل قسم لحالي أشوف
معدل كل قسم لحالي ال average تبع الطلاب في كل قسم
لو أنا عندي بدي أشوف مثلا average المرتب للموظفين
في كل قسم بدي أفرض أن عندي table employees هأعمل
select ال average لل salary معدل السلري معدل
الراتب المتوسط تبعه from table employees group by
department number صعبة ال group by ولا سهلة؟ سهلة
إن شاء الله ال
group by عشان أعدل ال select statement أحنا بدأنا
هأتكلم عن ال select و عن ال from و عن ال where
شرحنا طويلا في ال where و أضفنا select مع select من
خلال ال union و ال intercept و ال except و بعدها
عملنا select جوا select نصف ال query و الآن بضيف ال
group by و ال having ال group by بتأخذ قائمة
باسمها columns زي ما شفنا grouping على ال rating
group by على ال department number ممكن نحط طبعا
column أو أكثر نرتب و نعمل groups عليهم اللي بدنا
نعرفه إذا حطينا column أو أكثر نفرض حطينا two
columns معناته أنا بدي كل group قيمة ال two
columns فيهم متساويين لو أنا عملت group by بناء
على ال department number و ال... كمان ال...العمر
مثلا معناته لازم الطلاب اللي بدهم يكونوا في نفس ال
group لازم يكونوا من نفس department number ولهم
نفس العمر عشان أعتبرهم في نفس ال group ال having
هي زي ال where بحط فيها شرط بس الشرط هذا لمن؟ لل
group group qualification شرط لل group شرط لل
group نفسها شيء يتعلق في ال group بنا نحط شروط على
ال group ال groups نأخذها و ال group و ال groups
ما بدنا إياها كيف هنحط شروط على ال group خلينا
نشوف مثال عملي عشان نفهم إيش اللي بدنا نعمله بدا
نقطع عن كام slide و نأخذ هذا المثال و بعدين هنرجع
نشرح الكلام النظري الموجود ال query هذه اللي أحنا
شايفينها بتحسب عمر ال youngest seller مش ال oldest
أصغر واحد مادام بدي youngest بدي آخذ max ولا min؟
min بشرط إن عمره يكون ما له أكبر من أو يساوي 18
الشرط هذا أكبر من أو يساوي 18 بنحطه في ال where
الآن الشرط الثاني هو اللي بدي أحطه في ال having
بشرط إنه الآن المجموعة هذه بدي أرتبها حسب ال
rating for each rating لكل rating بدي أرتب groups
و بشرط أن المجموعة يكون على الأقل فيها at least two
sellers المجموعة يكون فيها اثنين يعني المجموعة
فيها واحد ما بديها هذا الشرط لمن؟ للمجموعة يعني
لازم أحسب المجموعات أول و بعد ما أحسب المجموعات
أعرف مين المجموعة اللي بدي آخذها و مين المجموعة
اللي بدي أشيلها فال having هذا الشرط أحنا بنحسبه
بعد ما نعمل بعد ما نعمل ال groups ما بنكون عارفين
نتيجته ال where قبل ال groups ال where بحسبه أول
بعدين بعمل ال groups بعدين حسب ال having بصف
بزيادة تعالوا نشوفها بتعمل select لل rating و ال
minimum age ال minimum age هي عملتيلها اسم as min
age from sailors where ال S age أكبر من أو يساوي 18
طلعوا في الجدولة اللي عندكم مين ال sailors اللي
عمرهم أكبر من أو يساوي 18 كلهم ما عدا واحد كلهم ما عدا
واحد الآن ده أروح أعمل لهم بعدها group by ال rating
أقسمهم حسب ال rating لو قسمهم حسب ال rating إيش
هيظهر عندي أول rating كام؟ السبعة كم واحد فيه
السبعة ال rating سبعة فيه اثنين two sailors ال
count العدد ال count اثنين طيب بعده... بعد السبعة
مين؟ كم واحد فيه؟ اللي بعده ال واحد؟ اثنين اللي
بعده؟ عشرة واحد ولا اثنين؟ لأن احنا شيلنا اللي
عمره ستة عشر مش عملنا where ال S H أكبر منه يساوي
ثمانية عشر ففي واحد راح اللي عمره ستة عشر راح هي
العشرة واحد التسعة فيها واحد الثلاثه اثنين الآن
having يعني كل group لها ال count أكبر من واحد ال
group الأولى ال count أكبر من واحد اه في اثنين
أكبر من واحد الواحد الثمانية العشرة التسعة ثلاثه
إذا النتيجة عندي أن ال groups اللي احنا بدنا إياها
بس هدول ال groups كم group؟ three groups السبعة
و الثمانية و الثلاثه فهتطلع عندي ال min age لجروب
الأولى كام ال min age لجروب الأولى اللي rating ان
تبعهم سبعة خمسة و ثلاثين الخمسة
و عشرين و نص ثلاثه برضه خمسة و عشرين و نص هي ال min
age و ال rating تبعهم اللي هو السبعة و الثمانية و
الثلاثه نتيجة ال query كلها النهائية select ال
rating سبعة ثمانية ثلاثه ال min age اللي هو كام
حسبنا خمسة و ثلاثين خمسة و عشرين و نص خمسة و عشرين
و نص السويس كم حضرتك منك على ال rating؟ اه صح...
صح توقفت من بعد؟ لعن؟ السويس كم حضرتك منك على ال
rating؟ كم بتاعك؟ صحيح دي خليني أكمل كلامك لأن...
لأن ال... الحجج group by هذا أي كلمة بيظهر في ال
group by بيصير مسموح نحطه في ال select ليش؟ لأنه
ال... ال min هذه هي min ل group هي ال minimum لمين
هذه ال minimum؟ ل ال group بتاعة ال rating هذه فكل
اللي في ال group اللي لهم نفس ال rating في ال
select
سيبونا من ال... من ال rating هذا الحين طلع عندي ال
min age هدول هايهم مش طلع عندي ال min age هدول
هدول ال minimum age لمين؟ لمجموعة من ال sailors في
rating معين يعني لهم نفس ال rating يعني ممكن أنا
أعرضه ال rating هذا ممكن أعرضه بس هل ممكن أعرض ال
name تبع ال sailor؟ لا مش ممكن ليش؟ لأنه ال group هذه
فيها اثنين أو ثلاثة أو أربعة أو خمسة مش كلهم اللي
هو بنفس ال name ممكن أعرض ال SID جنب ال ال min age
لا مش ممكن أعرض ال SID لأنه ال group فيها أكثر من
seller وبالتالي أكثر من SID لكن ال rating كلهم مش
تركين في نفس ال rating يا مريم كلهم مش تركين في
نفس ال rating اه خلاص انحفظ الاسم صحيح ال group by
لما حطينا فيها ال rating أي شيء بنحطه في ال group
by مباشرة بيصير مسموح نحطه في ال select يعني كمان
مرة نعيد المعلومة بتاعتنا احنا في الأول حكينا إذا
حطينا aggregate function في ال select ممنوع نحط
جنبها columns إلا إذا كان ال column موجود في ال
group by هيك تعدلت المعلومة
الآن نيجي كمان مرة شايفين نفس ال query نفس ال
query لو احنا شيلنا ال where هتتغير النتيجة العشرة
هدا إيش هتصير؟ هتصير اثنين فهتنجح هتصير true في
الشرط تبع من؟ تبع ال having هيطلع عندي كمان ال
group عشرة وكم من إيش فيها؟ ستة عشر is and where هذا
شرط بحذف فيه rows قبل اللي هو ال group by إذا عملت
ال group by إذا في having بحذف مجموعات مش rows ال
group by ال having تحذف مجموعات بناء على الشرط
اللي موجود طيب كمان معلومة إنه في ال having مش
ممكن أنا أحط column أعمل عليه شرط إلا إذا كان
موجود في ال group by ال having بنفعش أجي أعمل
having على ال name أو على ال SID ليش؟ لأنهم مش
موجودين في ال group by إذا صارت ال group by شرط
لظهور الكلمة في ال select و شرط لظهور الكلمة في ال
having مع ال aggregate functions aggregate
functions مفهومها في ال SQL مرتبط مع ال having و
مع ال group by هذه كلها package واحدة بتيجي مع بعض
group by having aggregate functions نستخدمهم مع
بعض بتماشوا مع بعض أي أي شيء جديد عليهم هيعملنا
مشاكل هنجرب
ال Oracle ونشوف النتائج عشان يعني نستهيب الموضوع
أكثر بس ده ارجع الشرح شوي حكينا عن ال select ال
where الشرط بتاع ال select ال having هو ال
qualification تبع ال group و بما أنه qualification
لل group لازم الشرط اللي هنا كلهم يكونوا موجودين
في ال group بقى ال group هي set of tuples that
each have the same value لل attributes اللي في ال
group list يعني أنا بدي أجمع ال rows اللي لهم نفس
القيم في ال list اللي أنا حطيتها في المثال اللي كان
ال rating اللي لهم نفس ال rating ال having بدعمل
restriction على ال group هذه الآن ال target list
هذه اللي في ال select target list اللي في ال
select لما أحط ال group by ده تم تقسيم لجزئين
aggregate operations مع ال column name أو attribute
names يعني اسمها columns بس إيش الشرط تبعهم هدول
attribute names لازم يكونوا إيش؟ يكونوا موجودين في
ال grouping list يكونوا موجودين في ال grouping
list هذا الشرط
هدول اللي بدهم يطلعوا في ال target list لازم
يكونوا مجموعة جزئية أو بتساوي ال target list اللي
في ال group يعني إذا في في ال group rating مسموح
أحط في ال select rating في age مسموح أحط age name
يعني أستبعد إن واحد يحط name بس ممكن بدنا نجمع
الاسمي و محمد مع بعض و اللي علي مع بعض و اللي ايّا
مع بعض و اللي مريم مع بعض و الاخرين، الرقم، رقم
الطالب أو رقم السيلر ممكن أحطه في ال group؟ ممكن،
بس إيش هيعطينا؟ هيعطينا كل واحد في group لحاله
لأنه مابتكررش، لأنه primary key، لأنه unique فهو
ممكن أحطه، بس مافي منه فايدة، مالهوش فايدة،
meaningless، مايله معنى، بس ممكن ينحط فاحنا عادة
بنحط الأمور اللي فيها تكرار اللي بنا نجمعها مع
بعض، بنا نجمعهم مع بعض
هي في عندي مثال إن أنا بتعمل select لاسم القسم و
ال average للراتب و أعطيه اسم إنه average راتب
from مثلا ال table ال instructors المدرسين ل group
by ال department name ليش حط ال department name في
ال select ليش مسموح لي أحطها في ال select لأنها
موجودة في ال group by أنا هجمع هي كالمدرسين كل
واحد حسب قسمه و نروح نعمل للقسم هذا عايش average لل
salary و أعرض اسم القسم و ال salary الراتب لو
حطينا بدل department name ال department number مش
هينفع ليش؟ لأنه مش موجود في ال group by لكن لو أنا
حطيت group by department name و هذه فاصلة
department number
هذه الـ semicolon بينفع أضع بدل department name
department number أو أعرض الأتنين حتى كمان لأنه
أصلا غالبا أو 100% ال department name و ال
department number ما بتكرروش مع بعض صح؟ ف أنا ممكن
أعمل group على الأتنين و أعرض الأتنين هذا
المثال اللي أخدناه كيف بنحسب ال select بعد ما ضفنا
ل group by كيف بحسب ال select أول شيء compute ال
cross product لل relation list قائمة ال tables
اللي عندي مش احنا حكينا في ال select أول شيء بعمل
cross product لل tables هعملهم بعدها هطبق ال
qualification اللي هي ال where و أحذف أسطر اللي ما
.. اللي ما بديها بعدها بدي أشيل ال unnecessary
fields ال columns اللي مذكور اسمها في ال select
بعدها بدي أعمل partitioning لل groups أقسم ال
groups حسب أنا بدي أعمل ال group على إيش؟ على ال
age؟ على ال rating؟ على العمر؟ على المعدل؟ بعد ما
أعمل ال groups بحذف ال groups اللي منحت groups
بناء على الشرط اللي وان موجود في ال having بشيل
groups بهيك أنا بكون عملت evaluation بشكل يعني
سليم ل select a statement فيها groups بكتفي بهذا
القدر اليوم المرة اللي جاي إن شاء الله بنكمل مع ال
aggregate functions و ال groups